目录
CRC校验原理
在二进制编码传输协议中,为了数据传输的正确性经常会采用循环冗余校验码CRC(cyclic redundancy check)来测试一个数据包是否有错误发生,循环冗余校验码的理论虽然比较复杂,但是实现原理却较为简单。在k位信息码(多项式表示为m(x))后再拼接r位的校验码,整个编码长度为n位,因此这种编码又叫(n,k)码。对于一个给定的(n,k)码,可以证明存在一个最高次幂为n -k= r的多项式g(x)。根据g(x)可以生成k位信息的校验码,而g(x)叫做这个CRC码的生成多项式。
校验码的具体生成过程为:假设发送信息用数据多项式m(x)表示,将m(x)左移n -k位,则可表示成m(x)× 2n-k。这样m(x)的右边就会空出n -k位,即校验码的位置。m(x)× 2n-k通过模2除法(异或运算,后面详解)除以生成多项式g(x)得到的商Q(x)和余数r(x),其中余数r(x)就是校验码。即
在发送端发送数据时余数加到信息码之后一同发出,将一组信息码和余数组成的数据块称为一个码元,设为T(x),则有T(x)= m(x)× 2 n-k+ r(x)。接收端在接收到二进制码流的多想表达式都能够被生成多项式g(x)整除,如果传输中未发生错误,则接收码元与发送码元相同,故接收的码元必定能被g(x)整除;若码元在传输中发生错误,则接收的码元可能除不尽而有余数,因此我们就以余数是否为零来判断接收码元中有无错误。可能有错误的码元正好也被g(x)整除,这是CRC校验无力消除的,但通过选择多项式g(x)和增加冗余位数,使余数r(x)多项式的位数增多,来降低发生这种错误的概率。