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


  • Mod

    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.


Anmelden zum Antworten