在上一篇发布了我的最新著作《深入理解计算机网络》一书的原始目录(http://blog.csdn.net/lycb_gz/article/details/8199839),得到了许多读者朋友的高度关注和肯定,本篇接着发一篇关于CRC码校验原理和CRC码计算方面的通俗诠释的试读文章。本书将于12月底出版上市,敬请留意!!

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. C语言CRC校验码计算与校验

    循环冗余校验(cyclicredundancy check,CRC)对传输序列进行一次规定的除法操作,将除法操作的余数附加在传输信息的后面.在接收端,也对收到的数据做相同的除法.如果接收端除法得到的结 ...

  5. bcc校验码计算_CRC校验你会吗?计算、校验、C语言实现,三步教你轻松搞定

    目录 前言 CRC算法简介 CRC计算 CRC校验 CRC计算的C语言实现 CRC计算工具 总结 前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了一 ...

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

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

  7. CRC码计算及原理(FCS帧校验序列生成)

    我们知道在以太网帧的末尾有一个叫FCS的东西. 全称:Frame Check Sequence,中文名:帧检验序列 这个东西是用来检验我们的数据是否在传输的过程中被破坏(不一定是收到攻击,也可能是一些 ...

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

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

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

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

  10. CRC校验码计算,以常用CRC-8为例

    CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定. CRC校验原理:在要发送的帧后面附加一个数,生成一个新帧发送给接收端.它要使所生成的新帧 ...

最新文章

  1. 使用Jupyter Notebook编写技术文档
  2. bootstrap之双日历时间段选择控件—daterangepicker(汉化版)
  3. spring bean scope作用域及多线程安全问题场景分析
  4. linux inotify-tools 监控文件变化
  5. C#中将字符串内容写入到txt文件中
  6. WPF in Visual Studio 2010
  7. 工业交换机厂家,工业交换机品牌前十大排名
  8. c++ qt获取电脑的内存_Qt官方示例信号量
  9. 【VSCode - Vetur 插件报错】Cannot find module ‘XXX‘ or its corresponding type declarations.Vetur(2307)
  10. Effective C# Item33:限制类型的可见性
  11. 内购订单进行二次处理_物流图表复杂业务场景下的订单管理系统搭建
  12. get请求是否 csrf认证流程_CORS和CSRF修炼宝典
  13. linux 一运行build卡,linux_system_build
  14. 阿里云解决方案架构师李晨:百万级价签系统的实时洞察与创新实践
  15. JavaScript高级程序设计(第3版)
  16. Android基础入门教程——4.3.2 BroadcastReceiver庖丁解牛
  17. python 欠采样_Python sklearn 实现过采样和欠采样
  18. 新赛季的中超和国安,荆棘中前行
  19. 运动学逆解(四足机器狗)
  20. CSDN ARIMA R语言_R语言时间序列:ARIMA / GARCH模型的交易策略在外汇市场预测应用...

热门文章

  1. cadence软件下载linux,Red Hat Linux 9.0下安装Cadence IC5.0
  2. 微星主板黑苹果_11.11黑苹果主机金牌装机单(intel篇)
  3. 一切从恢复系统开始(尽量不要学我恢复数据库的方法,我是个懒人^_^)
  4. 噪音测试软件+安卓,分贝噪音测试软件
  5. 用c语言编程设计简单的小游戏------走迷宫
  6. 2022全新趣盒iapp源码带后台非常好看UI
  7. lzg_ad:EWF RAM Reg模式原理介绍
  8. MATLAB的语言基础知识
  9. ora01017 linux,Oracle linux 7.5安装oracle 12c dg一直提示ORA-01017
  10. 天若OCR文字识别开源版 v5.0.0