2013-03-06 556 views
7

我试图与某些系统进行接口,并且在他们的规格中他们需要计算串行通信的CRC 16。下面是从文档的提取物如何使用多项式计算CRC 16 x16 + x12 + x5 + 1

“利用标准多项式消息的16位CRC CCITT,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, 

CRC值我得到的是

0xF2 0x24, 

但是他们的系统说它应该是

0xC0 0x2F 

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

回答

10

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

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

+4

+1'自我Learner' – 2013-03-06 14:02:36

+3

不,这是相同的多项式。 CRC实现使用位反转多项式是很常见的。 0x1021反转为0x8408。有关CRC16-CCITT Kermit CRC的说明,请参见http://reveng.sourceforge.net/crc-catalogue/16.htm#crc.cat.kermit,它记录了反思。 – 2013-03-07 15:53:24

+0

@MarkAdler谢谢 – fenix2222 2013-03-08 00:51:12