CRC8 校验函数

2019-04-14 16:41发布

CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。 它的编码规则是:
  1、首先将原信息码(kbit)左移r位(k+r=n)
  2、运用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码。

  非常简单,要说明的:模2除就是在除的过程中用模2加,模2加实际上就是我们熟悉的异或运算,就是加法不考虑进位,公式是:
  0+0=1+1=0,1+0=0+1=1
即‘异’则真,‘非异’则假。
  由此得到定理:a+b+b=a 也就是‘模2减’和‘模2加’直值表完全相同。

  有了加减法就可以用来定义模2除法,于是就可以用生成多项式g(x)生成CRC校验码。

例如: g(x)=x4+x3+x2+1,(7,3)码,信息码110产生的CRC码就是:
             101
11101 | 110,0000
        111 01
          1 0100
          1 1101
            1001
余数是1001,所以CRC码是110,1001

标准的CRC码是,CRC-CCITT和CRC-16,它们的生成多项式是:
  CRC-CCITT=x16+x12+x5+1
  CRC-16=x16+x15+x2+1   函数例举:   
/*
** 函数描述:
**  CRC8 校验函数
***********************************************************
**  传入参数  (char *buf):  指向要校验的数据的缓冲区
**  返回  :    CRC8校验值
*/
unsigned char crc8(char *buf)
{
 unsigned char i,j,crc;
 
  crc=0;
 //buf++;
 //buf++;
 for(j=1;j<7;j++)
 {
        crc=crc^(*buf);
        for(i = 8; i > 0; i--)
        {
            if(crc & 0x80)
            {
             crc = (crc<< 1)^0x31;
            }
    else
            {
             crc = crc<< 1;
    }
        }
    buf++;
 }
 return crc;
}