CRC8校验和函数从C#到VB.NET的转换
本文关键字:VB NET 转换 校验和 函数 CRC8 | 更新日期: 2023-09-27 17:59:16
我在将以下代码从C#转换为VB.NET.时遇到问题
C#代码
public static byte Crc8(byte[] data, int size) {
byte checksum = 0;
for (int i=0; i<=size; i++)
checksum += data[i];
return (byte)(-checksum);
}
VB.NET代码
Public Shared Function Crc8(ByVal data As Byte(), ByVal size As Integer) As Byte
Dim checksum As Byte = 0
For i As Integer = 0 To size - 1
checksum += data(i)
Next
Return CByte(-checksum)
End Function
问题是VB代码导致"算术运算导致溢出。"错误。
"+="运算符的操作方式似乎不同。在VB中,它实际上是在创建一个和(100+200=300),而在C#中,它对字节(100+202=44)执行某种操作。我似乎找不到它在做什么手术。
不同之处在于,默认情况下,C#只通过包装来处理溢出,因此255+1最终将为0。在VB中,默认情况下,溢出再次抛出System.OverflowException
。
在C#中,可以使用checked
和unchecked
关键字以细粒度的方式控制它。您也可以更改整个项目的默认值。例如,在Noda Time中,为了发现溢出,我启用了检查算术,但我故意通过使用unchecked
块将其关闭,以生成哈希代码(其中溢出可能是且无害的)。
不幸的是,据我所知,VB并没有细粒度的控制。您可以使用"Remove Integer overflow Checks"选项关闭整个项目的溢出检查,但不能仅对代码的某些部分执行此操作。
因此,在您的情况下,或者需要将这段代码移到另一个项目中,在那里您可以关闭溢出检查,<em]或者>
(顺便说一句,这似乎让在VB中实现GetHashCode
有点麻烦。)
为了将来参考,解决方案是:
Public Shared Function Crc8(ByVal data As Byte(), ByVal size As Integer) As Byte
Dim checksum As Byte = 0
For i As Integer = 0 To size - 1
checksum = (CInt(checksum) + data(i)) Mod 256
Next
If checksum = 0 Then
Return 0
Else
Return CByte(256 - checksum)
End If
End Function