我正在尝试编写一个用于串口通信的程序,我需要使用 CRC 发送数据包,我正在用 C# 语言编写此代码。
以下是接收方期望使用CRC的示例数据包。
10 02 B1 F0 3F 32 08 00 00 10 03 B4 5C
第二个数据包:10 02 B1 F0 3F 32 07 00 00 10 03 4D EE
10 - DLE 代码
02 - STX
B1 F0 3F 32 08 00 00 是数据
10 - DLE
03 -ETX
B4 - CRC 下再见
5C - CRC - 上再见
CCIT : (Fx) = x16 + x12 + x5 + 1
操作初始值:FFFFH
我尝试了一些在线CRC计算器,但到目前为止没有运气,任何人都可以指导如何计算上述数据的CRC(B1 F0 3F 32 08 00 00)? 也许可以建议在线计算器,它可以给我上面的输出(B4 5C)
。
感谢您的建议!
我找到了一些有效的东西,但似乎有点奇怪。
首先,我对两个样本进行了异或
10 02 B1 F0 3F 32 08 00 00 10 03 B4 5C
10 02 B1 F0 3F 32 07 00 00 10 03 4D EE
--------------------------------------
00 00 00 00 00 00 0F 00 00 00 00 F9 B2
这消除了初始CRC和最终异或值,并导致使用位反射0x11021 CRC。CRC似乎正在使用8字节的数据,包括尾随0x10。
使用下面链接的CRC计算器,选择任何CRC16,然后单击自定义并将参数设置为:输入反射选中,输出反射选中,poly = 0x1021。没有足够的信息来确定初始值和最终异或值,而没有不同大小的消息。使用 8 个字节的数据,一些示例选项包括:
初始值 = 0x5B08,最终异或值 = 0x0000,或初始值 = 0xffff,最终异或值 = 0xdde5,或初始值 = 0x0000,最终异或值 = 0xa169。使用反射参数时,计算器位反转 init 值(0x5B08 0x17DA位反转)。对于代码,3 个组合是 {0x17da,0x0000}、(0xffff,0xdde5}、{0x0000,0xa169}。多边形 = 0x8408并且是右移。
使用 xx 表示输入的数据,我得到了
xx xx B1 F0 3F 32 08 00 00 10 xx B4 5C
xx xx B1 F0 3F 32 07 00 00 10 xx 4D EE
由于前两个字节是 {10 02},固定值,因此可以通过更改初始值来包含它们。但是,我无法包含 ETX 03 值。
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
我在网上找到的第二个命中,但我在这里复制了它的内容以供参考:
using System;
public enum InitialCrcValue { Zeros, NonZero1 = 0xffff, NonZero2 = 0x1D0F }
public class Crc16Ccitt {
const ushort poly = 4129;
ushort[] table = new ushort[256];
ushort initialValue = 0;
public ushort ComputeChecksum(byte[] bytes) {
ushort crc = this.initialValue;
for(int i = 0; i < bytes.Length; ++i) {
crc = (ushort)((crc << 8) ^ table[((crc >> 8) ^ (0xff & bytes[i]))]);
}
return crc;
}
public byte[] ComputeChecksumBytes(byte[] bytes) {
ushort crc = ComputeChecksum(bytes);
return BitConverter.GetBytes(crc);
}
public Crc16Ccitt(InitialCrcValue initialValue) {
this.initialValue = (ushort)initialValue;
ushort temp, a;
for(int i = 0; i < table.Length; ++i) {
temp = 0;
a = (ushort)(i << 8);
for(int j = 0; j < 8; ++j) {
if(((temp ^ a) & 0x8000) != 0) {
temp = (ushort)((temp << 1) ^ poly);
} else {
temp <<= 1;
}
a <<= 1;
}
table[i] = temp;
}
}
}
原始链接:http://sanity-free.org/133/crc_16_ccitt_in_csharp.html