2013-03-06 158 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