2012-04-03 10 views
3

Ich bin auf der Suche nach einer CRC-8 Prüfsumme - und beim Lesen auf CRC im Allgemeinen stieß ich auf diesen Algorithmus für CCITT-16 (Polynom X^16 + X^12 + X^5 + 1):Wie funktioniert CRC-Algorithmen für CCITT16 und wie bekomme ich für CCITT8

unsigned char ser_data; 
static unsigned int crc; 

crc = (unsigned char)(crc >> 8) | (crc << 8); 
crc ^= ser_data; 
crc ^= (unsigned char)(crc & 0xff) >> 4; 
crc ^= (crc << 8) << 4; 
crc ^= ((crc & 0xff) << 4) << 1; 

Alternativ als Makro:

#define crc16(chk, byte)         \ 
     {             \ 
      chk = (unsigned char) (chk >> 8) | (chk << 8); \ 
      chk ^= byte;          \ 
      chk ^= (unsigned char)(chk & 0xFF) >> 4;   \ 
      chk ^= (chk << 8) << 4;       \ 
      chk ^= ((chk & 0xFF) << 4) << 1;     \ 
     } 

ich habe zwei Fragen hier:

  1. wie ist dieser Algorithmus der aus dem Polynom erhalten? Gibt es einen ähnlichen einfachen Algorithmus für CCITT8 (Polynom X^8 + X^2 + X + 1)?

Antwort

0

hier eine lose auf dem Code von dieser Antwort basierte C Implementierung von CRC8-CCITT (https://stackoverflow.com/a/15171925/1628701):

uint8_t crc8_ccitt(uint8_t crc, const uint8_t *data, size_t dataLength){ 
    static const uint8_t POLY = 0x07; 
    const uint8_t *end = data + dataLength; 

    while(data < end){ 
     crc ^= *data++; 
     crc = crc & 0x80 ? (crc << 1)^POLY : crc << 1; 
     crc = crc & 0x80 ? (crc << 1)^POLY : crc << 1; 
     crc = crc & 0x80 ? (crc << 1)^POLY : crc << 1; 
     crc = crc & 0x80 ? (crc << 1)^POLY : crc << 1; 
     crc = crc & 0x80 ? (crc << 1)^POLY : crc << 1; 
     crc = crc & 0x80 ? (crc << 1)^POLY : crc << 1; 
     crc = crc & 0x80 ? (crc << 1)^POLY : crc << 1; 
     crc = crc & 0x80 ? (crc << 1)^POLY : crc << 1; 
    } 

    return crc; 
}