简要介绍
循环冗余校验码(Cyclic Redundancy Code)是采用多项式的编码方式,将发送的数据看成是一个多项式的系数,数据为
b
n
−
1
b
n
−
2
…
b
1
b
0
b_{n-1}b_{n-2}…b_{1}b_{0}
bn−1bn−2…b1b0 (其中
b
i
b_{i}
bi 为 0 或 1),则其对应的多项式为:
b
n
−
1
X
n
−
1
+
b
n
−
2
X
n
−
2
+
…
+
b
1
X
+
b
0
b_{n-1}X^{n-1}+b_{n-2}X^{n-2}+…+b_{1}X+b_{0}
bn−1Xn−1+bn−2Xn−2+…+b1X+b0
例如:数据“10010101”可以写为多项式: X 7 + X 4 + X 2 + 1 X^{7} + X^{4} + X^{2}+1 X7+X4+X2+1。
校验方法的工作过程
(1) 设要发送的 k 位数据对应一个 k - 1 次多项式 K(x);r 位冗余位对应一个 r - 1 次多项式 R(x)。
(2) 发送方和接收方约定一个生成多项式 G(x) ,设该生成多项式的最高次幂为 r 。
(3) 在发送数据的末尾添加 r 个 0,则其相对应的多项式为 M(x) =
X
r
X^{r}
Xr K(x)。(左移 r 位)。
(4) 用 M(x) 除以 G(x) ,采用模 2 除法,获得商 Q(x) 和余式 R(x),则M(x) = Q(x) × G(x) + R(x)。
注:模 2 除法,从字面上可理解为二进制下的除法。
模 2 除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模 2 除法。
(5) 令 T(x) = M(x) + R(x),T(x) 所对应的数据是在原数据块的末尾加上余式对应的数据得到的。
(6) 发送 T(x) 所对应的数据。
(7) 设接收端接收到的数据对应的多项式为 T’(x),将 T’(x) 除以 G(x),若余式为 0,则认为没有错误,否则认为有错。即若 T’(x) = T(x),则
余式为 0。若 T’(x) ≠ T(x),余式不为 0。
常见的生成多项式:
CRC的检错能力
结论:若 G(X) 选取适当,则可以检测出:
- 全部单个错。
- 全部离散的二位错 。
- 全部奇数个错。
- 全部长度小于或等于 K 的突发错( K 为生成多项式的最高幂次)。
- 以1 - ( 1 / 2 ) K − 1 (1/2)^{K-1} (1/2)K−1的概率检出长度为 K + 1 位的突发错 。
CRC硬件实现
CRC 校验可以由软件或硬件来实现,现多采用超大规模集成电路芯片以硬件方式实现。