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)执行某种操作。我似乎找不到它在做什么手术。

CRC8校验和函数从C#到VB.NET的转换

不同之处在于,默认情况下,C#只通过包装来处理溢出,因此255+1最终将为0。在VB中,默认情况下,溢出再次抛出System.OverflowException

在C#中,可以使用checkedunchecked关键字以细粒度的方式控制它。您也可以更改整个项目的默认值。例如,在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