CRC校验理解

转自:bangbang170博文

在CRC算法中,将二进制数据流作为多项式的系数,然后进行的是多项式的乘除法。

1. 加减法采用模2运算,即异或运算。

2. 乘法即为实际乘法。

3. 除法为模2减法。

 

为了进行CRC运算,也就是这种特殊的除法运算,必须要指定个被除数,在CRC算法中,这个被除数有一个专有名称叫做“生成多项式”。最常用的几种生成多项式如下:

CRC8=X8+X5+X4+X0

CRC-CCITT=X16+X12+X5+X0

CRC16=X16+X15+X2+X0

CRC12=X12+X11+X3+X2+X0

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0

 

 

位宽(Width,简记为W),是多项式对应的二进制数的位数减1,CRC8的多项式二进制为100110001,则位宽为8。

 

生成多项式的最高位肯定为1,最高位的位置由位宽可知,故在简记式中,将最高的1统一去掉了,如CRC32的生成多项式简记为04C11DB7实际上表示的是104C11DB7。

 

位宽为4(W=4),按照CRC算法的要求,计算前要在原始数据后填上W个0,也就是4个0。

 

位宽W=1的生成多项式(CRC1)有两种,分别是X1X1+X0,(最高位为1,所以只能有10,11两种情况),读者可以自己证明10 对应的就是奇偶校验中的奇校验,而11对应则是偶校验。因此,写到这里我们知道了奇偶校验其实就是CRC校验的一种特例

 

增加了两个概念,第一个是“余数初始值”,第二个是“结果异或值”。

所谓的“余数初始值”就是在计算CRC值的开始,给CRC寄存器一个初始值。“结果异或值”是在其余计算完成后将CRC寄存器的值在与这个值进行一下异或操作作为最后的校验值。

常见的三种CRC 标准用到个各个参数如下表。

 

CCITT

CRC16

CRC32

校验和位宽W

16

16

32

生成多项式

x16+x12+x5+1

x16+x15+x2+1

x32+x26+x23+x22+x16+

x12+x11+x10+x8+x7+x5+

x4+x2+x1+1

除数(多项式)

0x1021

0x8005

0x04C11DB7

余数初始值

0xFFFF

0x0000

0xFFFFFFFF

结果异或值

0x0000

0x0000

0xFFFFFFFF

 

 

实际理解是:

  1. 按照多项式规定取除数
  2. 输入数据按模2运算移位除以除数。
  3. 得到余数即为CRC校验值。

猜你喜欢

转载自blog.csdn.net/good123day/article/details/88543610