在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)有两种,分别是X1和X1
+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 |
实际理解是:
- 按照多项式规定取除数
- 输入数据按模2运算移位除以除数。
- 得到余数即为CRC校验值。