#include #include #include uint8_t crc_table[256]; uint8_t flip_byte (uint8_t value) { value = ((value >> 1) & 0x55) | ((value & 0x55) << 1); value = ((value >> 2) & 0x33) | ((value & 0x33) << 2); value = ((value >> 4) & 0x0F) | ((value & 0x0F) << 4); return value; } uint8_t crc8 (uint8_t * data, size_t len) { unsigned i, j; uint8_t crc = 0, b; for (i = 0; i < len; ++i, ++data) { b = *data; for (j = 0; j < 8; j++) { if ((crc >> 7) ^ (b & 1)) { crc = (crc << 1) ^ 7; } else { crc = crc << 1; } b >>= 1; } } return crc; } void make_table (void) { unsigned i; unsigned j; uint8_t b; for (i = 0; i < 256; ++i) { b = i; for (j = 0; j < 8; j++) { if (b & 1) { b = (b >> 1 ) ^ 0xe0; } else { b = b >> 1; } } crc_table[i] = b; } } uint8_t crc8_better (uint8_t * data, size_t len) { uint8_t crc = 0; unsigned i; for (i = 0; i < len; i++, data++) { crc = crc_table[crc ^ *data]; } return flip_byte(crc); } int main (int argc, char *argv[]) { uint8_t fish[4] = "\5\0\1\301"; size_t l; make_table (); for (l=0;l<256;++l) { printf("0x%02x, ",crc_table[l]); } printf("\n"); for (l=0;l<4;++l ) { printf ("%u %02x %02x %02x\n",(unsigned)l, crc8 (fish, l), crc8_better (fish, l), fish[l]); } return 0; }