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

时间:2013-02-15 09:15:21

标签: c# vb.net crc

我在将代码从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 + 200 = 44)。 我似乎无法找到它正在做的操作。

2 个答案:

答案 0 :(得分:4)

不同的是,默认情况下,C#只通过包装来处理溢出 - 所以255 + 1最终会为0.在VB中 - 默认情况下,再次 - 溢出会抛出System.OverflowException

在C#中,您可以使用checkedunchecked关键字以细粒度的方式控制此问题。您还可以更改整个项目的默认值。因此,例如,在Noda Time中,我打开了检查算术以发现溢出,但我故意将其关闭以生成哈希码(其中溢出可能是且无害的)使用unchecked块。

不幸的是,据我所知,VB没有细粒度控制。您可以使用“删除整数溢出检查”选项关闭整个项目的溢出检查,但不能仅对代码的某些部分执行此操作。

所以在你的情况下,你 需要将这段代码移动到另一个项目,在那里你可以关闭溢出检查,你需要带溢出检查你的整个项目是否已关闭。

(顺便说一句,看起来这样会在VB a bit of a pain中实现GetHashCode。)

答案 1 :(得分:0)

为了将来参考,解决方案是:

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