如何用多项式x16 + x12 + x5 + 1计算CRC 16

fen*_*222 7 .net c# serial-port crc crc16

我正在尝试与某些系统接口,并且在他们的规范中,他们需要计算用于串行通信的CRC 16.以下是文档摘录

"利用标准多项式的消息的16位CCITT CRC,X16 + X12 + X5 + 1.种子值始终为0(零)"

首先,我只发现了2-3个C#代码示例,如何做到这一点似乎没有给我正确的值.我试过这个http://www.sanity-free.com/133/crc_16_ccitt_in_csharp.html,但我不确定要为初始值设置什么.我试了零但仍然无法正常工作.

我正在测试的数据是:

0x00 0x09 0x10 0x01 0x01 0x7C 0xF4 0xB8 0x00, 
Run Code Online (Sandbox Code Playgroud)

我得到的CRC值是

0xF2 0x24, 
Run Code Online (Sandbox Code Playgroud)

但他们的系统说它应该是

0xC0 0x2F
Run Code Online (Sandbox Code Playgroud)

我的理解是多项式x16 + x12 + x5 + 1 = 0x11021,但即使我在代码中使用它,它仍然给我错误的答案.我究竟做错了什么?

fen*_*222 10

我想到了.我不得不使用CRC16-CCITT Kermit实现.我认为他们的文档需要更新,因为它使用不同的多项式.

http://www.sanity-free.com/147/standard_crc16_and_crc16_kermit_implementation_in_csharp.html

  • 不,它是相同的多项式.CRC实现通常使用位反转多项式.0x1021反转为0x8408.CRC16-CCITT Kermit CRC的描述见http://reveng.sourceforge.net/crc-catalogue/16.htm#crc.cat.kermit,它注意到了反射. (4认同)