2013-03-06 13 views
7

Ich versuche, mit einigen Systemen zu interagieren und in ihren Spezifikationen CRC 16 für die serielle Kommunikation zu berechnen. Hier ist ein Auszug aus der DokumentationWie berechnet man CRC 16 mit Polynom x16 + x12 + x5 + 1

"16-Bit-CCITT CRC der Nachricht, die das Standard-Polynom verwendet, X16 + X12 + X5 +1. Seed-Werte sind immer 0 (null)"

Als erstes habe ich nur gefunden 2-3 Beispiele von C# -Code, wie es geht und keiner der scheint mir den richtigen Wert zu geben. Ich habe dieses http://www.sanity-free.com/133/crc_16_ccitt_in_csharp.html versucht, aber ich bin nicht sicher, was man für Anfangswert einstellt. Ich habe versucht, Nullen und immer noch nicht funktioniert.

Daten-I-Tests bin es mit ist:

0x00 0x09 0x10 0x01 0x01 0x7C 0xF4 0xB8 0x00, 

der CRC-Wert I erhalten ist

0xF2 0x24, 

aber ihr System sagt es

0xC0 0x2F 

Mein Verständnis ist, sein sollte, dass Polynom x16 + x12 + x5 + 1 = 0x11021, aber selbst wenn ich dieses im Code verwende, gibt es immer noch eine falsche Antwort. Was mache ich falsch?

Antwort

10

Ich fand es heraus. Ich musste CRC16-CCITT Kermit inmplementation verwenden. Ich denke, ihre Dokumentation muss aktualisiert werden, da sie ein anderes Polynom verwendet.

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

+4

+1 Für 'Selbst Learner' –

+3

Nein, es ist das gleiche Polynom. Es ist sehr üblich für CRC-Implementierungen, das Bit-umgekehrte Polynom zu verwenden. 0x1021 ist umgekehrt 0x8408. Die Beschreibung des CRC16-CCITT Kermit CRC befindet sich unter http://reveng.sourceforge.net/crc-catalogue/16.htm#crc.cat.kermit, wo die Reflektion notiert wird. –

+0

@MarkAdler Danke – fenix2222