CRC-16 CCITT berechnen
-
Hallo,
ich habe eine variable Anzahl an Bytes (zwischen 6 und 56), bei denen ich einen CRC machen muss.
Dafür wird der CRC-16-CCITT verwendet. Dabei werden lauter 1en vorgeladen und das Polynom lautet: x^16 + x^12 + x^5 + 1.
Gibt es in C++ in irgendeiner Bibliothek eine Funktion, mit der ich diesen CRC berechnen kann?
Danke!
Gruß
Shinzo
-
RyoShinzo schrieb:
Gibt es in C++ in irgendeiner Bibliothek eine Funktion, mit der ich diesen CRC berechnen kann?
Standardbibliothek? Nein.
Externe Bibliotheken? Selbstverständlich. 690.000 Treffer bei Google
-
Zwischen "Treffern" von Google und wirklich hilfreichen Seiten liegen leider noch Welten.
Das einzige, was ich über die Google-Suche gefunden habe ist CRC++, aber da hat man das Problem, dass man das Ergebnis nicht als integer bekommt, sondern als Polynom, das in einem String gespeichert ist...
-
RyoShinzo schrieb:
Hallo,
ich habe eine variable Anzahl an Bytes (zwischen 6 und 56), bei denen ich einen CRC machen muss.
Dafür wird der CRC-16-CCITT verwendet. Dabei werden lauter 1en vorgeladen und das Polynom lautet: x^16 + x^12 + x^5 + 1.
Gibt es in C++ in irgendeiner Bibliothek eine Funktion, mit der ich diesen CRC berechnen kann?
/// updates the state of the CRC16CCIIT shift register /// according to a given new bit of a data stream. /// @param state - old state /// @param bit - new bit /// @return new state unsigned crc16ccit_update(unsigned state, unsigned bit) { const unsigned poly = 0x1021; const unsigned x = ((state >> 15) ^ bit) & 1; return ((state << 1) & 0xFFFF) ^ (poly & (-x)); }
(Code ohne Gewähr)
Das bekommt man mit einer Lookuptabelle aber auch schneller hin... also dass man gleich 8 Bits auf einmal behandeln kan zB...
-
Boost.Crc hat ne CCITT 16 Implementierung.
#include <boost/crc.hpp> void foo() { boost::crc_ccitt_type crc_computer; crc_computer.process_block(begin, end); // alternativ crc_computer.process_bytes(ptr, length); crc_computer.process_block(begin, end); ... crc_computer.process_block(begin, end); uint16_t value = crc_computer.checksum(); }
Ungetestet. Andere CRC Varianten (hauptsächlich CRC32) hab' ich aus Boost.Crc allerdings schon erfolgreich verwendet.