This site might help:
Online CRC-8 CRC-16 CRC-32 Calculator
Also, this code might help playing around with different parameters:
Code:
#include <stdio.h>
static unsigned char bitswap(unsigned char s) {
unsigned char t = 0;
for(int i = 0; i < 8; i++) {
t <<= 1;
if(s & 1) {
t |= 1;
}
s >>= 1;
}
return t;
}
static int crc16_bit(int s, unsigned char bit, int reverse, int polynomial) {
if(reverse) {
if(s&1) bit ^= 1;
s >>= 1;
if(bit) s ^= polynomial;
} else {
if(s>>15) bit ^= 1;
s <<= 1;
s &= 0xFFFF;
if(bit) s ^= polynomial;
}
return s;
}
int crc16_byte(int s, unsigned char byte, int reverse, int polynomial) {
if(reverse)
byte = bitswap(byte);
s = crc16_bit(s, byte & 0x80 ? 1 : 0, reverse, polynomial);
s = crc16_bit(s, byte & 0x40 ? 1 : 0, reverse, polynomial);
s = crc16_bit(s, byte & 0x20 ? 1 : 0, reverse, polynomial);
s = crc16_bit(s, byte & 0x10 ? 1 : 0, reverse, polynomial);
s = crc16_bit(s, byte & 0x08 ? 1 : 0, reverse, polynomial);
s = crc16_bit(s, byte & 0x04 ? 1 : 0, reverse, polynomial);
s = crc16_bit(s, byte & 0x02 ? 1 : 0, reverse, polynomial);
s = crc16_bit(s, byte & 0x01 ? 1 : 0, reverse, polynomial);
return s;
}
int main(void) {
// Settings for CRC16/X-modem
int invert = 0;
int reverse = 0;
int polynomial = 0x1021;
// Data to calculate
unsigned char data[] = {0x41, 0x42, 0x43, 0x44};
int crc_state = 0;
if(invert)
crc_state ^= 0xFFFF;
for(int i = 0; i < sizeof(data)/sizeof(char); i++) {
crc_state = crc16_byte(crc_state, data[i], reverse, polynomial);
}
if(invert)
crc_state ^= 0xFFFF;
// Show data and results
printf("Data is:");
for(int i = 0; i < sizeof(data)/sizeof(char); i++) {
printf( " 0x%02X",data[i]);
}
printf("\n");
printf("CRC is 0x%04X\n", crc_state);
return 0;
}