我遇到了一个问题,我举了一个例子来计算 C# 中的 CRC16 Modbus从这里 我编译了代码,创建了一个单元测试:
[Test]
public void Crc16AnciCalculateTest()
{
Assert.AreEqual(new byte[] { 0x37, 0x4B }, Crc16AnciUtility.ComputeChecksumBytes(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }));
}
而且他没有通过。我检查了几个在线计算器,例如,这个
我在计算器中输入 123456789 并选择输入 ASCI:Modbus 的结果是 0x4B37。就我而言:
byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
退货 - B20E
我认为那是错误的例子。我拿了 nuget Tako.CRC,画了一个控制台应用程序:
static void Main(string[] args)
{
byte[] bytes = {1, 2, 3, 4, 5, 6, 7, 8, 9};
CRCManager crcManager = new CRCManager() {DataFormat = EnumOriginalDataFormat.HEX};
var provider = crcManager.CreateCRCProvider(EnumCRCProvider.CRC16Modbus);
var status = provider.GetCRC(bytes);
Console.Write("Input: ");
foreach (var b in bytes)
{
Console.Write(b + " ");
}
Console.WriteLine();
Console.WriteLine($"Output: {status.CrcHexadecimal}");
Console.ReadLine();
}
结果是一样的...
我不明白为什么该值与在线计算器不匹配?也许我没有正确输入数据?但是我尝试了即使输入一个数字或一行,结果仍然不收敛。相信谁?我会很高兴得到澄清和帮助,在此先感谢!
哦哦哦,解决了问题,一切都收敛了。我输入的数据不正确。该方法接受一个字节数组,我将整数传递给它。如果你通过了十六进制,那么一切都匹配。