本文主要是介绍crc16计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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
这篇关于crc16计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!