// CRC-16多项式
#define CRC16_POLY 0x1021
// CRC-16查表
static const uint16_t crc16_table[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
// ... 其他240个值 ...
};
// CRC-16初始化
uint16_t crc16_init(void) {
return 0x0000;
}
// CRC-16更新
uint16_t crc16_update(uint16_t crc, uint8_t data) {
return (crc << 8) ^ crc16_table[(crc >> 8) ^ data];
}
// CRC-16计算
uint16_t crc16_calculate(const uint8_t *data, uint16_t length) {
uint16_t crc = crc16_init();
for (uint16_t i = 0; i < length; i++) {
crc = crc16_update(crc, data[i]);
}
return crc;
}
|