#define POLY 0xA001 #define POLY 0x8005 unsigned crc16(unsigned crc, unsigned char *buf, size_t len) { while (len--) { crc ^= *buf++; crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; } return crc; } int main(void) { unsigned crc; unsigned char buf[] = {0x00, 0x19, 0x02 }; crc = crc16(0x0, buf, 3); printf("%04x\n", crc); crc = crc16(0xFFFF, buf, 3); printf("%04x\n", crc); return 0; }