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;
    }

posted @ 2024-07-22 21:37  小智001  阅读(8)  评论(0编辑  收藏  举报