
一.基本原理
CRC实际上,检验原理是在p位二进制数据序列之后附加一个r位二进制检验码(序列),从而形成总长为n=p+r位的二进制序列;附加在数据序列之后的检验码与数据序列的内容之间存在一定的关系。如果数据序列中的某个或某个位置因干扰等原因而出现错误,则会破坏这种特定关系。因此,通过检查这种关系,我们可以检查数据的正确性。
二.几个基本概念
1.帧检验序列FCS(FrameCheckSequence):添加冗余码进行错误检查。
2.多项模2运行:实际上是按位异或(ExclusiveOR)操作,即相同为0,相异为1,即不考虑进位.借位二进制加减操作。如:1001101111+11001010=01010001。
3.生成多项式(generatorpolynomial):当进行CRC检查时,发送方和接收方需提前约定除数,即生成多项式,一般记录为G(x)。生成多项式的最高位和最低位必须为1。常用的。CRC代码的生成有:
CRC8=X8+X5+X4+1
CRC-CCITT=X16+X12+X5+1
CRC16=X16+X15+X5+1
CRC12=X12+X11+X3+X2+1
CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1
每个生成多项式都可以对应一个代码,例如CRC8对应代码:100110001。
三.CRC检验码的计算
设置信息字段为K位,验证字段为R位,码字长度为N(N=K+R)。双方事先约定一个R次多项式g(x),则CRC码:
V(x)=A(x)g(x)=xRm(x)+r(x)
其中:m(x)K次信息多项式,r(x)为R-多项式一次校验。
这里r(x)相应的代码为冗余码,加入原始信息字段后形成CRC码。
r(x)计算方法为:在K位信息字段后面添加R个0,再除以g(x)对应的代码序列,得到的余数为r(x)相应的代码(应为R-1位;若不足,则在高位补0)。
四.错误检测
接收方收到数据时,使用收到的数据P(事先约定)模2除法。如果剩余数为0,则认为数据传输无错误;如果剩余数不为0,则认为数据传输有错误。由于我们不知道错误发生在哪里,我们不能自动纠正它们。一般的做法是丢弃接收到的数据。
五.几点说明:
1.CRC它是一种常用的检错码,不能用于自动纠错。
2.只要经过严格的选择,并使用足够位数的除数P,所以检测不到错误的概率很小。
3.只使用循环冗余检验CRC错误检测技术只能实现无错误接受(只是非常相似的认为没有错误),不能保证可靠传输。
CRC32具有以下特点:
1.静态的CRC32表或动态生成CRC32表,表的元素数为256,元素大小为4字节
2.在计算CRC32时,将进行查表操作,然后异常或上次CRC32结果右移8位
3.最终生成8字节CRC32值