CRC 的全称为Cyclic Redundancy Check,中文名称为循环冗余校验
它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制
实际上,除数据通信外,CRC在其它很多领域也是大有用武之地的
例如我们读软盘上的文件,以及解压一个ZIP 文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑
差错控制理论是在代数理论基础上建立起来的
这里我们着眼于介绍CRC 的算法与实现,对原理只能捎带说明一下
若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料
利用CRC 进行检错的过程可简单描述为:在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的r 位监督码(CRC 码),附在原始信息后边,构成一个新的二进制码序列数共 k+r 位,然后发送出去
在接收端,根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错
这个规则,在差错控制理论中称为“生成多项式”
1 代数学的一般性算法 在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数
例如 1100101 表示为 1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即 x6+x5+x2+1
设编码前的原始信息多项式为P(x),P(x)的最高幂次加 1 等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC 多项式为R(x);编码后的带CRC 的信息多项式为T(x)
发送方编码方法:将 P(x)乘以xr(即对应的二进制码序列左移 r 位),再除以G(x),所得余式即为R(x)
用公式表示为 T(x)=xrP(x)+R(x) 接收方解码方法:将 T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误
举例来说,设信息码为1100,生