c# - 为什么我在 C# 和 VB.NET 之间得到不同的 CRC16 结果?
问题描述
我将 C# 代码转换为 VB.NET 以进行 CRC16 计算。但是,我在 C# 和 VB.NET 上得到了不同的结果。我很困惑!有人可以指出我正确的方向吗?
//C# Codes
UInt16 CalculateCRC(Byte dchar, UInt16 crc16)
{
UInt16 mask = (UInt16) (dchar & 0x00FF);
crc16 = (UInt16)(crc16 ^ mask);
for (int i = 0; i < 8; i++)
{
UInt16 compare = (UInt16)(crc16 & 0x0001);
if ( compare == 1)
{
mask = (UInt16)(crc16 / 2);
crc16 = (UInt16)(mask ^ 0xA001);
}
else
{
mask = (UInt16)(crc16 / 2);
crc16 = mask;
}
}
return crc16;
}
'VB.NET Codes
Private Function CalculateCRC(ByVal dchar As Byte, ByVal crc16 As UInt16) As UInt16
Dim mask As UInt16 = Convert.ToUInt16((dchar And &HFF))
crc16 = Convert.ToUInt16((crc16 Xor mask))
Dim compare As UInt16
For i As Integer = 0 To 7
compare = Convert.ToUInt16((crc16 And &H1))
If compare = 1 Then
mask = Convert.ToUInt16((crc16 / 2))
crc16 = Convert.ToUInt16((mask Xor &HA001))
Else
mask = Convert.ToUInt16((crc16 / 2))
crc16 = mask
End If
Next
Return crc16
End Function
OUTPUT
dchar = 1
Variable values for each iteration (0 to 7)
C#
COMPARE : 0, 1, 0, 1, 0, 1, 0, 1
MASK : 32767, 16383, 20479, 10239, 17407, 8703, 16639, 8319,
CRC16 : 32767, 40958, 20479, 38414, 17407, 33278, 16639, 32894
VB.NET
COMPARE : 0, 1, 1, 1, 1, 1, 1, 1
MASK : 32767, 16384, 28672, 26624, 25600, 25088, 24832, 24704
CRC16 : 32767, 57345, 53249, 51201, 50177, 49665, 49409, 49281
有人可以指出我在 VB 代码中哪里做错了吗?显然,C# 代码产生了正确的结果。
解决方案
正如 Jimi 在评论中指出的那样,您需要使用整数除法 - 此外,“CUshort”应该就足够了:
Private Function CalculateCRC(ByVal dchar As Byte, ByVal crc16 As UInt16) As UInt16
Dim mask As UInt16 = CUShort(dchar And &HFF)
crc16 = CUShort(crc16 Xor mask)
For i As Integer = 0 To 7
Dim compare As UInt16 = CUShort(crc16 And &H1)
If compare = 1 Then
mask = CUShort(crc16 \ 2)
crc16 = CUShort(mask Xor &HA001)
Else
mask = CUShort(crc16 \ 2)
crc16 = mask
End If
Next i
Return crc16
End Function
推荐阅读
- ios - SwiftUI Expandable list 实现问题
- android - 通过长按拖动重新排序 LazyVerticalGrid 中的项目
- node.js - 在 vscode 测试运行脚本 (index.ts) 中传递命令行参数
- javascript - 在角度/电子应用程序中使用带有 socket.io 的 nodejs 脚本
- mysql - 复杂的mysql触发器与python代码的性能如何?
- matlab - 使用具有三个 10x5 双数组的单元格的 Matlab 组覆盖条字符
- unix - 如何将 sed 命令放入 while 循环中?
- json4s - JsonMethods 不是包 org.json4s.jackson 的成员
- json - Angular 项目未显示为 Chrome 扩展程序
- compilation - 创建静态链接共享库