首页 > 解决方案 > 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)

感谢您的意见!

标签: c#checksumcrc

解决方案


我发现了一些有用的东西,但它似乎有点奇怪。

首先我对这两个样本进行异或

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。

使用反射参数时,计算器位反转初始值(0x5B08 为 0x17DA 位反转)。对于代码,这 3 个组合是 {0x17da,0x0000}、(0xffff,0xdde5}、{0x0000,0xa169}。Poly = 0x8408 并且是右移。

使用 xx's 来表示 ingored 数据,我得到了

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


推荐阅读