一、CRC校验
1、简介
循环冗余校验(Cyclic redundancy check,“CRC”),本质上是选取一个合适的除数,要进行校验的数据是被除数,然后做模2除法,得到的余数就是CRC校验值。
2、常见CRC参考模型
POLY: 异或值(除数)
INIT: 校验初始值
XOROUT: 输出异或值
REFIN: 输入是否取反
REFOUT: 输出是否取反
3、计算流程(crc16)
#define CRC_DFE_POLY 0x8005
//POLY : 0x8005
//INIT : 0000
//XOROUT:0000
//REFIN: false
//REFOUT:false
uint16_t GetCRC16(uint8_t* buf, uint32_t len, uint16_t initcrc)
{
uint16_t crc16 = initcrc;
uint8_t i = 0, j = 0;
for (i = 0; i < len; i++)
{
crc16 ^= (uint16_t)(buf[i] << 8);
for (j = 0; j < 8; j++)
{
if ((crc16 & 0x8000) > 0)
{
crc16 = (uint16_t)((crc16 << 1) ^ CRC_DFE_POLY);
}
else
{
crc16 <<= 1;
}
}
}
return crc16;
}