0

我在将以下代码从 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) 执行某种操作。我似乎无法找到它在做什么操作。

4

2 回答 2

4

不同之处在于,默认情况下,C# 仅通过换行处理溢出 - 所以 255 + 1 最终会为 0。在 VB 中 - 默认情况下,再次 - 溢出会抛出System.OverflowException.

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

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

因此,在您的情况下,您要么需要将这段代码移动到另一个可以关闭溢出检查的项目,要么您需要为整个项目关闭溢出检查。

(顺便说一句,看起来这使得GetHashCode在 VB中实现有点痛苦。)

于 2013-02-15T09:23:24.613 回答
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
于 2013-02-15T09:41:38.227 回答