- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好的,这段代码可以工作,但我认为中间有一些必要的步骤才能得到结果。关于如何使它更紧的任何想法?
Public Function CalCheckSum(ByVal ByteList As List(Of Byte)) As List(Of Byte)
Dim total As Integer = 0
For Each b As Byte In ByteList
total = total + b
Next
Dim modedVal As Integer = 0
modedVal = total Mod &H100
Dim negatedValue As Integer = 0
negatedValue = &H100 - modedVal
Dim charList As List(Of Char) = Hex(negatedValue).ToCharArray.ToList
Dim returnList As New List(Of Byte)
For Each ch As Char In charList
returnList.Add(Asc(ch))
Next
Return returnList
End Function
顺便说一句,这是我用来测试它的:
Dim blist As New List(Of Byte)
blist.Add(&H52)
blist.Add(&H34)
blist.Add(&H35)
blist.Add(&H31)
blist.Add(&H32)
blist.Add(&H33)
blist.Add(&H34)
blist.Add(&H30)
blist.Add(&H30)
blist.Add(&H30)
blist.Add(&H30)
blist.Add(&H46)
blist.Add(&H46)
blist.Add(&H46)
blist.Add(&H46)
blist.Add(&H42)
blist.Add(&H4B)
blist.Add(&H9)
blist.Add(&H44)
Dim b As List(Of Byte) = CalCheckSum(blist)
b
的正确值是:
b(0)
= &H43b(1)
= &H39最佳答案
老实说,我不确定您为什么要浪费时间来优化它。在一个循环中调用该函数超过 100,000 次需要不到 20 毫秒。即使这是您的应用程序中的“热点”之一(因为您说它与嵌入式硬件设备通信),您也不太可能通过优化现有代码看到任何明显的速度提升。
但只是为了好玩,我决定看看我是否不能对事情进行一些优化......这是我想出的:
删除多余的 List(Of Char)
创建。您已经使用 ToCharArray
方法将值转换为数组。为什么要花费调用 ToList
的费用,只是为了遍历它?您也可以遍历数组。这将时间缩短到 8 秒左右,以最少的努力实现了相当大的加速。
您还可以将新 List(Of Byte)
的近似大小作为参数传递给构造函数。您已经从 charArray
的大小知道这一点,因为您只是将这些元素中的每一个添加回去。当您只处理两个项目时,这没有任何区别,如您提供的示例,但对于大量元素,它可以使事情稍微更有效率,因为 List
在循环期间的任何时候都不必动态调整大小。
Asc
、AscW
和 Convert.ToInt32
之间绝对没有区别。我明确地测量了它们中的每一个只是为了看看。我的直觉是将其更改为 AscW
,但显然这并不重要。许多人会对使用 VB 特有的习语嗤之以鼻,并推荐他们认为由 .NET Framework 提供的更通用的方法。事实证明,由于所有特定于 VB 的代码都是用与备选方案相同的托管代码编写的,因此使用哪种偏好只是一个简单的问题。
否则用简单数组替换 List(Of T)
也不会产生任何明显的差异。由于 List
更易于在函数外部使用,因此您不妨将其保留为返回类型。
所以我的最终代码看起来像这样:
Public Function CalCheckSum(ByVal ByteList As List(Of Byte)) As List(Of Byte)
Dim total As Integer = 0
For Each b As Byte In ByteList
total = total + b
Next
Dim negatedValue As Integer = 0
negatedValue = &H100 - (total Mod &H100)
Dim charArray As Char() = Hex(negatedValue).ToCharArray()
Dim returnList As New List(Of Byte)(charArray.Length)
For Each ch As Char In charArray
returnList.Add(CByte(Asc(ch)))
Next
Return returnList
End Function
即使在一个循环中运行 999,000 次,我始终将它计时在 62 到 64 毫秒之间。
您也可以使用 LINQ。这不是我的领域,我怀疑你会看到任何可测量的速度增加(它仍然必须在幕后进行相同数量的循环和迭代)。它提供的最大好处是您的代码更简单,看起来更干净。我很惊讶有人还没有发布这个解决方案。
编辑:顺便说一句,您的原始代码没有为我编译。我必须添加 CByte
运算符以将从 Asc
运算符返回的 Integer
值转换为 Byte
类型.这告诉我你不是在用 Option Strict 编程 上。 但您应该这样做。您必须在项目的属性中明确设置该选项,但强类型的好处远远超过检查和修复一些现有代码的成本。您甚至可能会注意到性能提升,尤其是在您无意中使用了大量后期绑定(bind)的情况下。
关于vb.net - 我怎样才能简化和优化这个校验和代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4812560/
如何在 PHP 中生成 CRC-8 校验和? 最佳答案 function crcnifull ($dato, $byte) { static $PolyFull=0x8c; for ($i=0
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试打印执行 CRC 操作的 XOR 函数的返回值时,它总是打印 0。我尝试了各种调试方法,例如打印语句,但是,我似乎无法弄清楚! 这是我的
ThinkPHP3.2.3验证码显示、刷新、校验 ,具体如下: 显示验证码 首先在Home/Controller下创建一个公共控制器PublicController
我想将自定义验证绑定(bind)到 TimePicker 自定义控件,但下面的代码显示“无法将内容添加到 TimePicker 的对象类型。”。
目录 Spring 校验(validator,JSR-303)实现 什么是JSR-303规范 与Spring MVC结合 实体类添加
导包和配置 导入 JSR 303 的包、hibernate valid 的包 ?
我是一名优秀的程序员,十分优秀!