Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#到VB.NET的CRC8校验和函数转换_C#_Vb.net_Crc - Fatal编程技术网

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

从C#到VB.NET的CRC8校验和函数转换,c#,vb.net,crc,C#,Vb.net,Crc,我在将以下代码从C#翻译到VB.NET时遇到问题 C#代码 问题是VB代码导致“算术运算导致溢出”错误 似乎“+=”运算符的操作方式不同。在VB中,它实际上是在创建一个和(100+200=300),在C中,它是在字节(100+200=44)上执行某种操作。 我似乎找不到它在做什么操作。不同之处在于,默认情况下,C#只通过换行处理溢出-因此255+1最终将为0。在VB中-默认情况下,再次-溢出抛出System.OverflowException 在C#中,您可以使用checked和unchecke

我在将以下代码从C#翻译到VB.NET时遇到问题

C#代码

问题是VB代码导致“算术运算导致溢出”错误

似乎“+=”运算符的操作方式不同。在VB中,它实际上是在创建一个和(100+200=300),在C中,它是在字节(100+200=44)上执行某种操作。
我似乎找不到它在做什么操作。

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

在C#中,您可以使用
checked
unchecked
关键字以细粒度的方式控制这一点。您还可以更改整个项目的默认设置。例如,在野田佳彦的时候,我打开了checked算术以发现溢出,但我故意通过使用
未选中的
块来关闭它以生成哈希代码(溢出可能是无害的)

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

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


(顺便说一句,看起来这使得在VB中实现
GetHashCode
)不同之处在于,默认情况下,C#只需换行即可处理溢出-因此255+1最终将为0。在VB中-默认情况下,再次-溢出抛出
System.OverflowException

在C#中,您可以使用
checked
unchecked
关键字以细粒度的方式控制这一点。您还可以更改整个项目的默认设置。例如,在野田佳彦的时候,我打开了checked算术以发现溢出,但我故意通过使用
未选中的
块来关闭它以生成哈希代码(溢出可能是无害的)

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

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


(顺便说一句,这似乎使得在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

供将来参考,解决方案是:

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

真不敢相信我没想到。我总是在VB中使用默认设置。。。不管怎样,谢谢你给我指明了正确的方向。似乎解决方案是使用模数256(255和+1)。@CoolCow:当您关闭溢出检查时,它确实可以使用模数256。你可以用整数做所有的算术运算,然后显式地使用mod 256,是的……真不敢相信我没想到。我总是在VB中使用默认设置。。。不管怎样,谢谢你给我指明了正确的方向。似乎解决方案是使用模数256(255和+1)。@CoolCow:当您关闭溢出检查时,它确实可以使用模数256。你可以用整数做所有的算术运算,然后显式地使用mod 256,是的……只是出于好奇,为什么你要从for循环中的“size”中减去1?数组的大小不会从C#更改为VB.NET。在VB中,您在C#中声明了一个数组,该数组的上限与大小成反比,但如果您的方法需要大小,那么在VB和C#中也是一样的。只是出于好奇,为什么在for循环中从“大小”中减去1?数组的大小不会从C#更改为VB.NET。在VB中,您在C#中声明了一个数组,该数组的上限与大小成反比,但如果您的方法需要大小,则在VB和C#中的结果将是相同的。
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