CRC码计算及校验原理计算

 

如何根据多项式计算 循环CRC码

5.3.2 循环冗余校验检错方案

      奇偶校验码(PCC)只能校验一位错误,本节所要介绍的循环冗余校验码(CRC)的检错能力更强,可以检出多位错误。

       1. CRC校验原理
      CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

      【说明】“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。如100101除以1110,结果得到商为11,余数为1,如图5-9左图所示。如11×11=101,如图5-9右图所示。

 

           图5-9 “模2除法”和“模2乘法”示例

     具体来说,CRC校验原理就是以下几个步骤:

   (1)先选择(可以随机选择,也可按标准选择,具体在后面介绍)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。

   (2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,也称之为FCS(帧校验序列)。但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略

   (3)再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端,最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。

    通过以上介绍,大家一定可以理解CRC校验的原理,并且不再认为很复杂吧。

    从上面可以看出,CRC校验中有两个关键点:一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式);二是把原始帧与上面选定的除进行二进制除法运算,计算出FCS。前者可以随机选择,也可按国际上通行的标准选择,但最高位和最低位必须均为“1”,如在IBM的SDLC(同步数据链路控制)规程中使用的CRC-16(也就是这个除数一共是17位)生成多项式g(x)= x16 + x15 + x2 +1(对应二进制比特串为:11000000000000101);而在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多项式g(x)=x16 + x15 + x5 +1(对应二进制比特串为:11000000000100001)。

       2.    CRC校验码的计算示例
      由以上分析可知,既然除数是随机,或者按标准选定的,所以CRC校验的关键是如何求出余数,也就是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除法”运算法则。

 

                                      图5-10 CRC校验码计算示例

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

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

    通过以上CRC校验原理的剖析和CRC校验码的计算示例的介绍,大家应该对这种看似很复杂的CRC校验原理和计算方法应该比较清楚了。

   下面大家做一个练习,假设CRC生成多项式为G(X) = X5 + X4 +X+1,要发送的二进制序列为100101110,求CRC校验码是多少。

  • 36
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
### 回答1: CRC-16/CCITT是循环冗余校验(Cyclic Redundancy Check)的一种常见法,它用于对数据进行检验,以确定数据是否在传输过程中发生错误。它的计算原理和实现如下。 CRC-16/CCITT法使用16位的校验,它可以检测到多达2^16-1(65535)位错误。 CRC-16/CCITT的计算是基于一个预设的生成多项式,在该法中,该多项式被定义为0x1021(二进制为10001000000100001)。 法的实现过程如下: 1. 初始化一个16位的寄存器为全1(0xFFFF),这个寄存器用来保存计算后的校验。 2. 从数据的最高位开始,逐位地将数据与寄存器的最高位进行异或操作(XOR),然后将寄存器向左移位一位。 3. 如果寄存器的最高位为1,则将寄存器与预设的生成多项式进行异或操作。 4. 继续将数据的下一位与寄存器的最高位进行异或操作,然后将寄存器向左移位一位。重复这个步骤,直到计算完整个数据。 5. 最后得到的寄存器的值就是CRC-16/CCITT的校验。 在实际的数据传输中,发送方计算数据的CRC-16/CCITT校验,并将校验附加在数据的末尾一起发送给接收方。接收方收到数据后,再次计算数据的CRC-16/CCITT校验,与接收到的校验进行比较。如果两者相同,表示数据传输没有出错;如果不同,表示数据传输发生错误,需要进行重新传输。 总之,CRC-16/CCITT是一种简单且高效的校验法,它可以帮助我们检测数据传输过程中的错误,并保证数据的完整性。 ### 回答2: CRC-16/CCITT是一种循环冗余校验,用于检测数据传输中的错误。它是根据国际电报电话咨询委员会所制定的标准所确定的。 CRC-16/CCITT的计算原理是将发送的数据按位划分为多个字节,并对每个字节进行处理。首先,需要定义一个生成多项式,用来进行CRC计算CRC-16/CCITT的生成多项式为x^16 + x^12 + x^5 + 1。 具体的实现步骤如下: 1. 初始化一个16位的寄存器为0xFFFF。 2. 将第一个字节与寄存器的低8位异或,然后将寄存器右移一位。 3. 如果最低位是1,则将寄存器与0xA001异或,否则不进行异或操作。 4. 重复第2步和第3步,直到处理完所有字节。 5. 最后得到的寄存器内的值就是CRC-16/CCITT的校验结果。 例如,如果要计算字符串"Hello"的CRC-16/CCITT校验,可以按照如下步骤进行: 1. 将字符'H'转换为ASCII,得到0x48。 2. 将0x48与0xFFFF异或,然后将寄存器右移一位,得到0x2400。 3. 由于最低位是0,因此不进行异或操作。 4. 重复上述步骤,依次处理剩下的字符。 5. 最终得到的CRC-16/CCITT校验为0xF303。 通过计算CRC-16/CCITT校验,我们可以在数据传输过程中检测出错误。如果接收方接收到的数据与计算得到的校验不一致,就意味着数据可能被篡改或传输过程中出现错误。 ### 回答3: CRC-16/CCITT是一种用于数据传输中的差错检测方法,采用循环冗余校验CRC法,使用16位的校验和。它的计算原理及实现如下。 首先,将要传输的数据按位进行排列,最高位作为第一个比特位,最低位作为最后一个比特位。接着,定义一个初始值为0xFFFF的寄存器,用于存储即将进行校验的数据。 然后,按照以下步骤进行计算校验: 1. 将第一个比特位输入到寄存器中。 2. 如果寄存器最高位为1,则进行一次异或运,结果与0x1021进行按位异或。 3. 将寄存器中所有比特位向右移动一位,即除以2,并舍弃最低位。 4. 重复步骤2和3,直到所有的比特位都输入到寄存器中。 当所有比特位输入完毕后,计算得到的寄存器的值就是CRC-16/CCITT的校验和。将该校验和附加在原始数据后面,一起进行传输。 在接收端,接收到数据后,也按照同样的方式进行计算。如果计算得到的校验和与接收到的校验和相同,说明数据在传输过程中没有发生错误;如果不同,则说明数据发生了错误。 CRC-16/CCITT具有快速计算的特点,适用于大部分数据传输场景。它可以有效检测出传输中的错误,并能够根据校验和进行纠错。实际实现时,可以使用位操作和异或运来进行高效的计算。 总结起来,CRC-16/CCITT是一种通过对数据进行位操作和异或运得到校验和的差错检测方法,能够有效检测传输中的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻开门2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值