Funktion zur Berechnung einer CRC16-Prüfsumme
Ich arbeite an einer Bibliothek, um eine einfache und zuverlässige Kommunikation über eine RS232- oder RS485-Verbindung bereitzustellen. Ein Teil dieses Codes beinhaltet die Verwendung einer CRC16-Prüfsumme für die Daten, um eine Beschädigung durch Leitungsrauschen zu erkennen. Ich habe eine Funktion zum Berechnen einer CRC16-Prüfsumme erstellt, die jedoch anscheinend keine korrekten Werte ausgibt.
Der relevante Code, den ich geschrieben habe, ist unten (er kann auch gefunden werdenHier).
<code>#include <stdint.h> #define CRC16 0x8005 uint16_t gen_crc16(const uint8_t *data, uint16_t size) { uint16_t out = 0; int bits_read = 0, bit_flag; /* Sanity check: */ if(data == NULL) return 0; while(size > 0) { bit_flag = out >> 15; /* Get next bit: */ out <<= 1; out |= (*data >> (7 - bits_read)) & 1; /* Increment bit counter: */ bits_read++; if(bits_read > 7) { bits_read = 0; data++; size--; } /* Cycle check: */ if(bit_flag) out ^= CRC16; } return out; } </code>
Ich überprüfe meine Ausgabe gegendieser Online-CRC-Rechner.
Ich bin zu dem Schluss gekommen, dass entweder mein Verständnis der Berechnung eines CRC16 falsch ist oder der Online-Rechner falsch ist (ersteres scheint wahrscheinlicher zu sein). Kann mir jemand sagen, wo ich falsch liegen könnte?