如何根据多项式计算 循环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校验码是多少。

CRC码计算及校验原理计算相关推荐

  1. 32位crc校验码程序_CRC码计算及校验原理的最通俗诠释

    CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的.其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注 ...

  2. CRC 计算及校验原理

    第一步 给定要发送的数据码 原数据码 =10110011 第二步 根据给定的生成多项式,确定除数码, 除数码 = 11001 第三步 根据生成多项式的最高阶次幂(此处为4),在数据码后补 4个0 新数 ...

  3. java crc计算_JavaCRC校验原理

    一.基本原理 CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列:附加在数据序列之后的这个检验码与数据序列的内容之间存在着 ...

  4. 计算机网络原理 计算题,计算机网络原理计算题

    计算机网络原理计算题 1. 在数字传输系统中,码元速率为600波特,数据速率为1200bps,则信号取几种不同的状态?若要使得码元速率与数据速率相等,则信号取几种状态?(请给出公式与计算步骤) 解:C ...

  5. 协议crc计算_CRC校验原理及代码实现(一)

    网上的有关CRC的原理和代码实现的文章,数不胜数,但比较全的好像还没看到:此文是集百家之智慧,加之自己的使用经验和理解汇聚此文,让你快速理解和使用CRC,当然不足之处欢迎评论区吐槽. 1. CRC是什 ...

  6. 2.1.5 校验码(一文带你分析搞懂:奇偶校验码、海明码、CRC码)

    文章目录: 什么是校验码? 为什么要有校验码? 1.奇偶校验码 怎么通过奇偶校验码判断数据是正确还是错误呢? (1)奇校验 (2)偶校验 为什么无法检查出偶数个错误? 2.海明(汉明)校验码 什么是海 ...

  7. [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

    1.CRC.FCS是什么 比奇小说网 https://m.biqi.org/ CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据 ...

  8. 码crc校验_CRC计算

    循环冗余码校验英文名称为 Cyclical Redundancy Check,简称 CRC,它具有更高性能 的检错能力.CRC 利用除法余数的原理来检测错误, 它将两个字节数据流进行二进制除法 (没有 ...

  9. php crc16校验算法,PHP串口通信中计算crc16校验码

    最近使用PHP开发串口通信业务,在发送485Modbus命令时,基本都要计算CRC16校验码.网上搜索了很多文章,很多都计算的不对.本文记录搜索到的正确的计算方法. 代码如下:/** * crc16计 ...

  10. Android CRC16计算产生校验码

    好久没有更新啦,最近做了一个关于CRC16校验的项目,把这个方法分享给大家,代码如下: /**      * CRC16计算产生校验码      *      * @param data 需要校验的数 ...

最新文章

  1. 认识RESTful设计风格
  2. 自定义控件详解(三):Canvas效果变换
  3. 台湾RD技术谈|嘉宾郭家齊董大偉黃保翕
  4. Linux crontab命令
  5. Android在string.xml中定义html文档并加载显示,以及拦截WebView链接事件
  6. 如何成为数据科学家_成为数据科学家需要了解的10件事
  7. ORA-04031错误分析和解决
  8. HTML获奖作品,2015年配色优秀的20个网页设计作品 含配色方案
  9. 2017人人都是产品经理年度作家评选结果公告
  10. 更好用计算机怎么打,电脑输入法哪个好用(最受欢迎的7大输入法对比详情)...
  11. [Bug]: Could not load dynamic library ‘libnvinfer.so.7‘
  12. SpringBoot实现QQ邮箱发送功能
  13. python ccf题解 201412-3 集合竞价
  14. SpringBoot整合email
  15. Windows下的远程命令行工具pstools
  16. 超5亿中国人的熬夜大赏,快看有你吗?
  17. 公司企业网站SEO优化详解教程
  18. “10•24”专供:Spark全套知识体系,免费领!
  19. Hadoop理论——hdfs读、写流程
  20. 科学等于艺术,艺术等于科学

热门文章

  1. 小程序毕设作品之微信酒店预订小程序毕业设计(1)开发概要
  2. 百度文库免费下载最新攻略,全新的百度文库下载方式
  3. 躲开追捕不容易 大数据时代我们如何抓小三
  4. 数据提取软件----GetData
  5. CAN:CANape使用Scripts编制脚本
  6. 读掘金小册组件精讲总结3
  7. [NOIP2017 普及组 T1] 成绩
  8. java 爬取微信公众号文章 - 搜狗微信搜索
  9. 计算机列举几种常见的算法,列举十大计算机经典算法
  10. [ATL/WTL]_[Gdiplus]_[关于使用Gdiplus来绘制反锯齿的圆角矩形]