CRC-16 ANSI / IBM

par skywodd | | Langue : C++ | Licence : GPLv3

Description :

CRC-16 ANSI / IBM

  • CRC 16 bits

  • Polynôme 0x8005

  • Valeur initiale 0x0000

  • Inversion de l'entrée et de la sortie

  • Pas de XOR final

Code source :

Voir le code source brut | Télécharger crc16_ibm.c | Télécharger crc16_ibm.c.zip

#include <stdint.h>


uint16_t bit_reflect(uint16_t data, unsigned char nbits) {
    uint16_t output = 0;
    for (unsigned char i = 0; i < nbits; ++i) {
        if (data & 1) 
            output |= 1 << ((nbits - 1) - i);
        data >>= 1;
    }
    return output;
}


uint16_t crc16_ibm(char* data, unsigned int data_len) {
    uint16_t crc = 0;

    if (data_len == 0)
        return 0;

    for (unsigned int i = 0; i < data_len; ++i) {
        uint16_t dbyte = bit_reflect(data[i], 8);
        crc ^= dbyte << 8;
        
        for (unsigned char j = 0; j < 8; ++j) {
            uint16_t mix = crc & 0x8000;
            crc = (crc << 1);
            if (mix)
                crc = crc ^ 0x8005;
        }
    }

    return bit_reflect(crc, 16);
}