深入理解CRC校验

来源:互联网 发布:sqlserver generator 编辑:程序博客网 时间:2024/05/19 00:15

CRC校验原理简介:

    CRC校验就是将传输的数据当做一个位数很长的数,将这个数除以另一个数( “模2除法” )。得到的余数作为校验数据附加到原数据后面。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。如果有余数,则表明该帧在传输过程中出现了差错。

模二除法实例

这里写图片描述

CRC校验分为以下几个步骤:

     (1)先选择一个用于在接收端进行校验时,对接收的帧进行除法运算的除数。   (这个除数是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。
     (2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码。但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。
    (3)再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端;最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。

注意:
    作为除数的二进制比特串:最高位和最低位必须均为“1”

CRC校验码计算实例:

    现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。

(1)首先把生成多项式转换成二进制数,由 G(X) = X4 + X3 + 1 可以知道(,它一共是5位(总位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个二进制的第4位、第3位、第0位的二进制均为1,其它位均为0)很快就可得到它的二进制比特串为11001

(2)因为生成多项式的位数为5,根据前面的介绍,得知CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以生成多项式,得到的余数(即CRC码)为0100,如图5-10所示。注意参考前面介绍的“模2除法”运算法则。

这里写图片描述

(3)把上步计算得到的CRC校验0100替换原始帧101100110000后面的四个“0”,得到新帧101100110100。再把这个新帧发送到接收端。

(4)当以上新帧到达接收端后,接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除,验证余数是否为0,如果为0,则证明该帧数据在传输过程中没有出现差错,否则出现了差错。

以上