寻求Concox VTS设备的CRC-16/X-25 C#计算实现方案
CRC-16/X-25 C#实现(适配Concox VTS设备)
你需要的是CRC-16/X-25算法的实现,而非CRC32。该算法的核心参数如下:
- 多项式:
0x1021 - 初始CRC值:
0xFFFF - 输入字节:按位反转
- 输出结果:按位反转后异或
0xFFFF
实现代码(查表法,效率更高)
public static class Crc16X25 { private static readonly ushort[] CrcTable = new ushort[256]; static Crc16X25() { ushort polynomial = 0x1021; for (ushort i = 0; i < 256; i++) { ushort crc = 0; ushort currentByte = (ushort)(i << 8); for (byte j = 0; j < 8; j++) { if (((crc ^ currentByte) & 0x8000) != 0) { crc = (ushort)((crc << 1) ^ polynomial); } else { crc <<= 1; } currentByte <<= 1; } CrcTable[i] = crc; } } public static ushort Compute(byte[] data) { ushort crc = 0xFFFF; foreach (byte b in data) { byte reversedByte = ReverseBits(b); crc = (ushort)((crc << 8) ^ CrcTable[(crc >> 8) ^ reversedByte]); } crc = ReverseBits((ushort)crc); return (ushort)(crc ^ 0xFFFF); } private static byte ReverseBits(byte b) { return (byte)(((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16); } private static ushort ReverseBits(ushort value) { return (ushort)(((ReverseBits((byte)(value >> 8))) | ((ushort)ReverseBits((byte)value) << 8))); } }
直接计算法(无查表,适合小数据量)
public static class Crc16X25Direct { public static ushort Compute(byte[] data) { ushort crc = 0xFFFF; ushort polynomial = 0x1021; foreach (byte b in data) { byte reversedByte = ReverseBits(b); crc ^= (ushort)(reversedByte << 8); for (int i = 0; i < 8; i++) { if ((crc & 0x8000) != 0) { crc = (ushort)((crc << 1) ^ polynomial); } else { crc <<= 1; } } } crc = ReverseBits(crc); return (ushort)(crc ^ 0xFFFF); } private static byte ReverseBits(byte b) { return (byte)(((b * 0x0802LU & 0x22110LU) | (b * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16); } private static ushort ReverseBits(ushort value) { return (ushort)(((ReverseBits((byte)(value >> 8))) | ((ushort)ReverseBits((byte)value) << 8))); } }
测试你的数据
用你提供的字节数组验证:
byte[] data = { 0x11, 0x01, 0x03, 0x33, 0x33, 0x00, 0x94, 0x10, 0x95, 0x20, 0x20, 0x08, 0x25, 0x81, 0x00, 0x23 }; ushort result = Crc16X25.Compute(data); Console.WriteLine(result.ToString("X4")); // 输出 90DD
关键说明
- 输入字节按位反转是CRC-16/X-25的硬性要求,这也是你之前用CRC32库无法得到正确结果的核心原因
- 最终结果必须经过反转并异或
0xFFFF,才能匹配Concox VTS设备的校验规则
内容的提问来源于stack exchange,提问作者Maruf Hossain
相关产品推荐
相关产品推荐

