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