crc16计算,以生成式G(x)=x16+x15+x2+1,为例
1、函数如下:
//crc:G(x) = x16+x15+x2+1
#define POLY 0x8005 //对应的生成式的多项式,可以查(在在线计算crc工具下查)
unsigned short crc16_2(unsigned char *data, int len, u16 init) {unsigned short crc = init; //0xFFFF,0x0000 //初始值for (int i = 0; i < len; i++) {crc ^= (unsigned short)data[i] << 8;for (int j = 0; j < 8; j++) {if (crc & 0x8000) { //高位/低位在前crc = (crc << 1) ^ POLY;}else {crc <<= 1;}}}return crc;
}
2、使用技巧
当接收的字符比较长时,一次将字符全部接收比较浪费资源,可以分段使用:
//分段计算
result = crc16_2(data, 10, 0x0000); // 调用CRC函数计算CRC值
result = crc16_2(&data[10], length - 10, result); // 调用CRC函数计算CRC值
printf("crc16_2 分段计算出 value: %X\n", result); // 输出CRC值
3、附
crc在线计算工具:
CRC在线计算crc在线计算,循环冗余校验在线计算https://www.lddgo.net/encrypt/crc#toolNoteIframe