【计算机硬件基础知识】CRC校检码

来源:互联网 发布:非结构化数据库产品 编辑:程序博客网 时间:2024/06/05 07:47

       CRC,即Cyclic Redundancy Check的英文简称,也就是我们说的循环冗余校检码。CRC可以检查数据中的多位错误,比奇偶校检码相对多了那么几位的校检功能。下面叙述下CRC的工作原理(看着比较麻烦,就分段叙述了)

原理浅述

       1、我们假设有一段K位的原码需要进行校检,使用CRC进行效检的时候,我们需要在在K位原码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。

       2、对于一个给定的(N,K)码,存在一个最高次幂的为N-K=R的多项式G(x)。我们根据这个多项式G(x)就可以生成K位原码信息的校验码(方法后面简述),这个多项式G(x)我们叫做这个CRC码的生成多项式。

  对于生成多项式,我们有一些要求:

  1)生成多项式的最高位和最低位上的值必须为1;

  2)当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模二运算下的除法后应该使该余数不为0;

  3)不同位发生错误时,所得到的的余数应该是不同的;

  4)对余数继续做模二运算下的除法,得到的余数数列是一个循环数列。

       3、K位校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R)(至于乘以2的原因我认为是在二进制背景下进行的缘故),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。

模二运算

       上面那个定义比较深奥,下面借助模二运算对CRC的原理进行简单阐述。使用CRC对原码进行校检,需要在原码后面补上一个二进制数列(位数不定)。附加的这个二进制数可以使得补上二进制数列后生成的新帧能够被发送端和接收端经过模二运算选出的特定的数整除(模二运算背景下的整除)。若在接受端经过模二运算下的整除后没有余数,则证明数据在传送过程中没有出错,反之则否。
下面介绍模二运算。

规则

       模二运算的规则和数学汇总的算数除法以及异或运算都有些联系。相对于算术除法,模二运算既不向上位错位,也不比较出书和被除数的相同位上数值的大小,只要以相同位数进行相除即可;相对于异或运算,模二运算同样没有错位,同时也没有进位,具体的模二运算的加减法规则如下:
       加法:1+1=0;0+1=1;0+0=1
       减法:1-1=0;0-1=1;1-0=1;0-0=1
       模二运算中不涉及到小数的计算,直接是取余运算,下面是一个模二运算的取余小例子:

校检步骤

       CRC校检码的原理和通过CRC校检码对原帧of(原帧,Original Frame)进行校检时需要用到的模二运算都已经简单阐述了下,下面我们看下CRC校检的大概步骤:
       1、通过生成多项式,选择接收端对经过CRC校检处理过后的新帧nf(New Frame)(原码加上校检码)做取余运算的除数a(二进制);
       2、确定除数a的位数K,在需要进行校检的原码后面加上K-1(K-1就是校检码的位数)个0,得到一个新帧nf;
       3、以新帧nf作为被除数,以除数a作为除数进行模二运算,所得到的的余数r就是该帧的校检码,也称为帧校检序列(FCS,Frame Check Sequence);
       4、将得到的校检码r附加在原帧of后面构建出一个用于发送的新帧Pnf(Pass New Frame)发送到接收端;
       5、接收端将接受到的新帧Pnf以模二运算除以前面约定的除数a。若没有余数则证明该帧在传输过程中没有出现错误;反之,该帧在传输过程中出现了错误。

校检例子

例子

       假设我们所选择的CRC生成多项式为G(X)= X4+X3+1,计算二进制序列10110011的CRC校检码。

过程

1、将CRC生成多项式G(X)转换为二进制数(也就是我们说的余数a):

       G(X)的最高次幂为4,二进制数共有4+1=5位;
       G(X)没有二次幂和一次幂,二进制数的第一位和第二位上的值均为0,其余位上的值均为1;
       综上,所求二进制数(余数a)为11001(PS,二进制数最左边的为第一位)

2、计算校检码的位数

       生成多项式的最高次幂为4(或者是除数a的位数K-1),所以校检码的位数为K-1=4;

3、计算新帧nf:

       在原帧of的后面加上4(K-1)个0得到新帧nf101100110000;

4、计算校检码FCS:

       以新帧nf101100110000做被除数,以a11001做被除数,进行模二运算;
       余数0100(余数位数小于K-1时,在余数最高位前补0,缺几位补几个0)即为校检码FCS
       以新帧nf101100110000,余数a11001,进行模二运算为例:

5、确定发送的新帧Pnf

       原帧of10110011后面加上FCS0100即为需要进行发送的新帧Pnf101100110100。

总结

       以上就是计算CRC校检码的过程,需要注意的是除数a的确定和模二运算中相关法则的使用。后续的关于上篇博客奇偶校检(PCC)和本篇博客循环冗余校验(CRC)对出现错误的发送帧的错误定位问题我们在后续的学习中再做讨论。
       【计算机硬件基础知识】海明校检码基础
感谢您的宝贵时间,祝生活愉快,谢谢~~
                                                                           ——joker
2 1
原创粉丝点击