在计算机网络和数据通信中,用得最广泛的检错码, 是一种漏检率低得多也便于实现的循环冗余码 CRC, CRC码又称为多项式码
任何一个由二进制数位串组成的代码, 都可以唯一地与一个只含有0和1两个系数的多项式建立一一对应的关系。 例如, 代码1010111 对应的多项式为 , 同样多项式
对应的代码为101111。
CRC码在发送端编码和接收端校验时, 都可以利用事先约定的生成多项式G(X)来得到。 k位要发送的信息可对应于一个(k-1)次多项式K(X), r位冗余位则对应于一个(r-1)次多项式R(X), 由k位信息位后面加上r位冗余位组成的n=k+r位码字则对应于一个(n-1) 次多项式 , 例如
信息位: 1011001 --->
冗余位:1010 --->
码字: 10110011010 ---->T(X) = X的4次方 * K(X) + R(X)
= X的10次方+ X的8次方+ X的7次方+ X的4次方+ X的3次方+ X
由信息位产生冗余位的编码过程,就是已知K(X)求R(X) 的过程。在CRC码中可以通过找到一个特定的r次多项式G(X) (其最高项
的系数恒为1 ), 然后用 K(X) 去除以G(X), 得到的余式就是R(X).
特别要强调的是,这些多项式中的 " + " 都是 模2加(也就是异或运算); 此外这里的除法也是模2除法, 即除法过程中用到的减法是模2减法, 它和模2加法的运算规则一样, 都是异或运算, 这是一种不考虑加法进位和减法借位的运算,即
0 + 0 =0, 0+1 =1, 1+0=1, 1+1=0
0-0=0, 0-1=1, 1-0=1, 1-1=0;
在进行基于模2运算的多项式除法时,只要部分余数首位为1, 便可上商1, 否则上商0, 然后按模2减法求得余数, 该余数不计最高位。 当被除数逐位除完时, 最后得到比除数少一位的余数。此余数即为冗余位,将其添加在信息位后便构成CRC码字。
其中Q(X)为商式。根据模2运算规则R(X)+R(X)=0的特点, 可将上式改记为
[X的r次方 * K(X) + R(X)] / G(X) =Q(X)
即 T(X) / G(X) = Q(X)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
理论上可以证明循环冗余校验码的检错能力有以下特点:
- 可检测出所有奇数位错
- 可检测出所有双比特的错
- 可检测出所有小于、等于校验位长度的突发错
CRC码是由 X的r次方 * K(X)除以某个选定的多项式后产生的, 所以该多项式称生成多项式。一般来说,生成多项式位数越多校验能力越强。 但并不是任何一个 r + 1 位的二进制数都 可以作 生成多项式。 目前广泛使用的生成多项式主要有以下四种:
例1: 已知生成多项式:, 求信息位 1010010 的CRC码
解析: 因为信息位为1010010, 所以对应的公式 K(x) = ,
又因为生成多项式 C(X) = , 故取r=4, 则 X的4次方 * K(X) = ,对应的代码 10100100000,
由模2除法 求得余式R(X) = , 又因为T(X) = X的4次方 * K(X) + R(X), 所以
T(X) = , 所以T(X) 对应的代码为 10100101011,
故信息位 1010010 的 CRC码为 10100101011
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
模2除法_百度百科