7.22日今日总结之CRC8校验
今日学习通讯协议时,发现客户的数据采用了CRC8校验,之前用的都是和校验或者异或校验,头次使用CRC8校验,因此上网查阅资料学习了一下。
CRC8校验一般使用的多项式为X8+X2+X1+1
CRC8算法是通过对数据进行模2除法运算来计算余数,也称异或运算,然后将余数附加到原始数据后面,形成被校验的数据。
具体流程如下:
1.选择一个校验多项式,多项式的位数决定了CRC8算法的性能,可以使用通用标准的多项式,也可以随意选择,但是最高位和最低位必须为1。如X8+X2+X1+1,对应的多项式为0x07(高位舍去)
2.因为需要 8 位 CRC 校验,所以将需要将待校验的数据左移 8 位,低位补0。
3.将待校验数据左移8位后与校验多项式二进制数按高位对齐,低位不够则补0的方式进行异或运算。
4.将上一步得到的结果的高位0全部去掉继续与校验多项式二进制数按高位对齐,低位不够则补0的方式进行异或运算。
5.重复上一步骤直到最终结果只有8位有效数据,即为计算得出的特征值(校验码)。
从网上COPY了一段程序并加以改进,并使用在线验证工具验证通过了
附上在线验证链接> http://www.ip33.com/crc.html
/*************************************************************
-
函数名称: Crc_8
-
函数功能: 生成crc8 密匙
-
入口参数: p_buffer 需要校验的数据首地址 buf_size:需要校验的数据的长度
-
返回参数: 生成的crc8 秘钥
-
说明:p_buffer的空间必须要要>=buf_size 此函数不负责检测数据溢出
************************************************************/
static unsigned char Crc_8( unsigned char p_buffer, unsigned char buf_size )
{
unsigned char crc = 0,i;
if(buf_size <= 0) //数据长度小于等于0则直接返回CRC=0
{
return crc;
}
while( buf_size-- )
{
for ( i = 0x80; i != 0; i /= 2 )
{
if (crc & 0x80) //判断最高位是否为1,最高位为1不需要异或,直接左移,然后再与0x07异或
{
crc = (crc<<1)^0x07; // 多项式:X8 + X2 + X + 1
}
else //最高位为0不需要异或,直接左移一位
{
crc<<1;
}if ( (*p_buffer & i) != 0 ) { crc ^= 0x07; } } p_buffer++;
}
return crc;
}