2013-03-06 7 views
7

Próbuję połączyć się z niektórymi systemami i w ich specyfikacjach wymagają obliczenia CRC 16 dla komunikacji szeregowej. Oto wyciąg z dokumentacjiJak obliczyć CRC 16 z wielomianem x16 + x12 + x5 + 1

„16-bitowe CCITT CRC wiadomości z wykorzystaniem standardowego wielomianu, X16 + X12 + X5 +1. Wartości nasienne są zawsze 0 (zero)”

Przede wszystkim ja tylko znaleźć 2-3 próbki kodu C#, jak to zrobić i żadna z nich nie wydaje mi się właściwą wartością. Próbowałem ten jeden http://www.sanity-free.com/133/crc_16_ccitt_in_csharp.html, ale nie jestem pewien, co ustawić na wartość początkową. Próbowałem zer i nadal nie działa.

Dane ja sprawdzając je za pomocą brzmi:

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

wartość CRC mogę to

0xF2 0x24, 

jednak ich system mówi, powinien on być

0xC0 0x2F 

moim rozumieniu jest to, że wielomian x16 + x12 + x5 + 1 = 0x11021, jednak nawet jeśli użyję tego w kodzie, nadal daje mi złą odpowiedź. Co ja robię źle?

Odpowiedz

10

Wymyśliłem to. Musiałem użyć aplikacji CRC16-CCITT Kermit. Myślę, że ich dokumentacja wymaga aktualizacji, ponieważ używa innego wielomianu.

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

+4

+1 Dla 'Self-Learner' –

+3

Nie, to jest ten sam wielomian. W implementacjach CRC bardzo często używa się wielomianu odwróconego bitem. 0x1021 odwrócone jest 0x8408. Opis CRC16-CCITT Kermit CRC znajduje się pod adresem http://reveng.sourceforge.net/crc-catalogue/16.htm#crc.cat.kermit, który odnotowuje odbicie. –

+0

@MarkAdler Dzięki – fenix2222