字节数组CRC计算的C#实现:C代码移植求助
正确移植CRC计算的C代码到C#实现
你的C#代码存在以下关键问题,导致计算结果不正确:
- 循环范围错误:原C代码遍历传入的所有字节,但你的C#代码只遍历到
message.Length - 2,少处理了最后两个字节。 - 冗余的位操作:
(CRCFull >> 1) & 0xFFFF是多余的,因为CRCFull是ushort类型,右移后自动保持16位,不会出现高位溢出。 - 不必要的变量类型:
CRCLSB使用char类型不合适,直接用bool或byte更直观。
以下是和原C代码逻辑完全对齐的C#实现:
private ushort CalculateCrc(byte[] data) { ushort crcValue = 0xFFFF; int index = 0; int dataLen = data.Length; while (dataLen-- > 0) { crcValue ^= data[index++]; for (int i = 0; i < 8; i++) { bool hasLsbSet = (crcValue & 0x0001) != 0; crcValue = (ushort)(crcValue >> 1); if (hasLsbSet) { crcValue ^= 0xA001; } } } return crcValue; } // 调用示例,将结果转为指定格式的字节数组 private void GetCRC(byte[] message, ref byte[] CRC) { ushort crc = CalculateCrc(message); CRC[0] = (byte)(crc & 0xFF); // 低字节 CRC[1] = (byte)((crc >> 8) & 0xFF); // 高字节 }
测试验证
用你提供的测试数组new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00 },计算得到的CRC值为0x840A(对应字节数组[0x0A, 0x84]),和原C代码的计算结果完全一致。
内容的提问来源于stack exchange,提问作者Ahmet
相关产品推荐
相关产品推荐

