C# 中的 CRC-CCITT 16 位计算



我正在尝试编写一个用于串口通信的程序,我需要使用 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

最新更新