我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下计算机中的编码问题,来看第三部分,循环冗余码。
很多初学者一看到CRC就郁闷,因为课本上关于CRC的描述实在是太难懂了。那就跟随我一起来搞懂CRC,我用最简单最好懂的方式描述,我不会使用高深的数学术语,你一定能看懂。
开篇我要强调一点的是:
由于有线线路错误率非常低,所以在有线线路中,使用错误检测和重传机制比使用纠错方式更为有效。而无线线路相比有线线路,具有噪声更多和容易出错的特点,所以在无线线路中广泛采用纠错码。
循环冗余校验码CRC广泛用于数据链路层的错误检测。
CRC把二进制位串看成系统为0和1的多项式。一个k位的二进制数字串看成是一个k-1次多项式的系数列表,该多项式有k项,从x的k-1次方到x的0次方。
该多项式属于k-1阶多项式,形式为:
a1*(x的k-1次方)+a2*(x的k-2次方)+......+an-2*(x的1次方)+an-1*(x的0次方)
举例:1101有4位,可以代表一个3阶多项式,系数分别为1、1、0、1,多项式的形式为:
x的3次方+x的2次方+1
使用CRC编码,需要先商定一个生成多项式G(x),注意注意,很多资料里都没有说清楚,我们这里说的G(x)是另外一个商定的多项式,和上面这段说的这个k-1阶多项式没有关系。生成多项式的特点是:最高位和最低位必须是1。
假设原始信息有m位,则对应多项式M(x)。生成校验码思想就是在原始信息位后追加若干校验位,使得追加的信息能被G(x)整除。接收方接收到带校验位的信息,然后用G(x)整除。余数为0,则没有错误,反之则发生错误。
我们先来看看如何生成CRC校验码。还是和上次一样,我们用例子来说明。
假设原始信息串为10110,然后,另外再商定一个CRC的生成多项式为G(x)=x的4次方+x的1次方+1,求CRC校验码。
1。原始信息后添加0。假设生成多项式G(x)的阶为r,则在原始信息位后添加r个0,新生成的信息串共m+r位,对应多项式设定为x的r次方*M(x)。
G(x)=x的4次方+x的1次方+1的阶为4,即10011,则在原始信息10110后添加4个0,新信息串为101100000。
2。使用生成多项式除。利用模2除法(所谓的模2除法就是每一位进行异或运算),用对应的G(x)位去除串x的r次方*M(x)对应的位串,得到长度为r位的余数。除法过程如图:
得到余数1111。(余数不足r,则余数左边用若干个0补齐。如求得余数为11,r=4,则补两个0得到0011。这个余数就是原始信息的校验码。
3。将余数添加到原始信息后。本例中,原始信息为10110,添加余数1111后,结果为101101111。到这里为止,生成CRC校验码的工作结束了。
接下来是CRC校验的工作了。
CRC校验过程与生成过程类似,接收方接收了带校验和的数据后,用多项式G(x)来除。余数为0,则表示信息无错;否则要求发送方进行重传。注意,收发信息双方需要使用相同的生成多项式。到这里为止,所以工作结束。
那有哪些常见的CRC生成多项式呢?
有的,比如CRC-16=x的16次方+x的15次方+x的2次方+1。该多项式用于FR、X.25、HDLC、PPP中,用于校验除帧标志位外的全帧。
再比如CRC-32=x的32次方+x的26次方+x的23次方+x的22次方+x的16次方+x的12次方+x的11次方+x的10次方+x的8次方+x的7次方+x的5次方+x的4次方+x的2次方+x的1次方+1。该多项式用于校验以太网(802.3)帧(不含前导和帧起始符)、令牌总线(802.4)帧(不含前导和帧起始符)、令牌环(802.5)帧(从帧控制字段到LLC层数据)、FDDI帧(从帧控制字段到INFO)、ATM全帧、PPP除帧标志位外的全帧。
作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。