线性分组码中有一种重要的码称为循环码(Cyclic code),这种码编码和解码都不太复杂,而且检(纠)错能力较强。循环码除了具有线性分组码的一般性质外,还具有循环性。循环性是指任一码组循环一位以后(即将最右端的一个码元移至左端,或反之)以后,仍然为该码中的一个码组
什么是CRC校验?
CRC即循环冗余校验码:
是数据通信领域中最常用的一种查错校验码;
其特征是信息字段和校验字段的长度可以任意选定。
循环冗余检查(CRC, Cyclic Redundancy Check)是一种数据传输检错功能,对数据进行多项式计算(利用多项式,对数据进行模2除法),并将得到的结果附在帧的后面传输,接收设备接收后也执行类似的算法(依旧利用同一个多项式,对接收的数据进行模2除法,但是这里要求没有余数才算是正确传输),以保证数据传输的正确性和完整性。CRC利用除法及余数的原理,实现错误侦测的功能,具有原理清晰、实现简单等优点。
相比于奇偶校验(PCC)只能校验一位错误,循环冗余校验码的检错能力要更强,能够检出多位错误。
CRC校验原理
其根本思想就是先在要发送的帧后面附加一个数(即用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
【百科】
循环冗余校验算法将是否除尽,作为数据信息的校验规则。对于能被多项式除尽的数据而言,其数据代码的误码率就较低;对于那些不能被多项式除尽的数据,需要对数据出错的地方进行分析,并将产生的余数进行减去。,如果让被校验数据减去余数,势必能为生成多项式所除尽,但网络通信中减法操作存在复杂的数学计算,无法使用拼装的方式进行数据编码。
基于此种情况,网络通信中引入模2运算的计算方式,模2运算包括:模2加、模2减、模2乘、模2除等四种二进制运算。模2运算不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。两个序列模二相加,即两个序列中对应位,相加不进位,相同为0不同为1。在两个二进制位相运算时,这两个位的值能确定最终的运算结果,而不受前一次运算的影响,因此模2运算的加减乘除属于异或运算。
模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。
模2除法/乘法:
CRC校验步骤
CRC校验中有两个关键点:
(1)预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式G(x)),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1即生成多项式G(x)要求次数大于0,并且要求0次幂的系数为1。;
G(x)为发送端和接收端预先约好的生成多项式。G(x)的选取对校验效果起着关键的作用,使用较多的生成多项式G(x)有CRC-16、CRC-CCITT、CRC-32等;
CRC16的生成多项式为:G(x)= X16+X10+X2+1
CRC32的生成多项式为:G(x)= X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1
(2)把原始帧(假设为k位, 对应信息多项式)与上面计算出的除数(二进制比特串或生成多项式 G(x),假设为m位)进行模2除法运算,余数作为CRC校验码。
CRC校验码计算示例:现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。
设要发送的数据码有k位,则该数据码对应的多项式F(x)有k项,k的每一位取值只能为0或1,即F(x)中每项X^n的系数只能是0或1。
R(x)为生成的 r 阶冗余码多项式,R(x)的项数比G(x)要少一项。R(x)的计算方法为:以F(x)作为被除数&