2013-03-06 11 views
7

Sto cercando di interfacciarmi con alcuni sistemi e nelle loro specifiche richiedono di calcolare CRC 16 per la comunicazione seriale. Ecco un estratto dalla documentazioneCome calcolare CRC 16 con polinomiale x16 + x12 + x5 + 1

"16 bit CCITT CRC del messaggio utilizzando il polinomio standard X16 + X12 + X5 +1. I valori di semi sono sempre 0 (zero)"

Prima di tutto ho trovato solo 2-3 esempi di codice C# su come farlo e nessuno sembra darmi il valore corretto. Ho provato questo uno http://www.sanity-free.com/133/crc_16_ccitt_in_csharp.html, ma non sono sicuro di cosa impostare per il valore iniziale. Ho provato gli zeri e ancora non funziona.

dati sto testando con è:

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

il valore CRC che ottenga è

0xF2 0x24, 

tuttavia il loro sistema dice che dovrebbe essere

0xC0 0x2F 

mia comprensione è che polinomiale x16 + x12 + x5 + 1 = 0x11021, tuttavia anche quando lo uso nel codice mi dà ancora una risposta errata. Che cosa sto facendo di sbagliato?

risposta

10

L'ho capito. Ho dovuto usare l'implementazione di CRC16-CCITT Kermit. Penso che la loro documentazione debba essere aggiornata poiché utilizza un diverso polinomio.

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

+4

+1 Per 'Self-Learner' –

+3

no, è lo stesso polinomio. È molto comune per le implementazioni CRC utilizzare il polinomio bit-invertito. 0x1021 invertito è 0x8408. La descrizione di CRC16-CCITT Kermit CRC è su http://reveng.sourceforge.net/crc-catalogue/16.htm#crc.cat.kermit, che prende atto della riflessione. –

+0

@MarkAdler Grazie – fenix2222