计算机底层:循环冗余校验码CRC

信息位+校验位组成循环冗余校验码,也称CRC码。

循环冗余校验码的思想:

        通过将信息进行除以某个规定的数,这个数是提前约定好的,并且两边都知道的数。

        假设信息是882,约定了除数是7

        那么为啥是7呢?计算机可以通过逆运算推出来,当找到可以令余数为0的数时,两边计算机就可以约定将这个数作为除数

        如果得到余数为0,那么这个信息就是正确的,如果不是0,则是错误的:

        以上是为了方便理解循环冗余校验码,但是并不是真正的循环冗余校验码的过程。切勿将以上认作是循环冗余校验码

但以上的十进制除法的方式,与循环冗余校验码还是很像的。

循环冗余校验码CRC:

用题目理解:p

     

与上面一样的是:会规定一个除数和被除数。

除数:

        会通过生成多项式,来规定除数。起始除数是一串二进制码,那图中的生成多显示G(x)怎么是一个函数呢?

G(x)可以分解成如上图所示,这样就可以得到一串二进制:1101,而这就是真正的生成多项式。

        那题目中生成多项式G(x)是如何的来的呢?

        计算机想要得到生成多项式,首先需要确定需求,我们是要纠错呢?还是只需要查错呢?因为我们并不了解循环冗余校验码是如何差错或是纠错的,因此可以先看完整篇文章后,再看这里。

        如果想要使校验码拥有纠错能力。那么需要设定知道信息位数K,和校验位数R。使得2^R≥K+R+1。这个公式的意思和海明校验码的意思一样:用2^R所能表示的状态数量,能够表示出错位置的数量。其中R的位数是生成多项式所确定位数的-1个位数。这里不太懂也可以看完整篇文章,再看这里。

        学到后面其实还会发现,生成多项式表示的位数越多,校验强度其实越高,既然如此就极易消耗cpu和内存。因此计算机规定校验位数量时,会依据计算机的计算能力和存储能力进行判断。

以上内容下面会解释。

除数的作用:

        1.用于得到校验位上的校验码。

        2.用于对CRC校验码进行校验。

被除数:

        被除数包括了两种:

        1.信息位作为被除数,即题目中的:101001。信息位作为被除数,是为了得到校验位上的校验码。

        2.信息位+校验位即CRC码作为被除数,是为了进行CRC校验码进行校验。

        可以看到题目中的要求是得到CRC 码,就是得到校验位。

获取校验位:

想要得到校验位,需要有:1.信息位,2.生成多项式。

        信息位是:101001

        生成多项式是:1101

        得到两个信息后,需要将除数(生成多项式)的位数-1,那么就是n=3(最高次幂),得到的这个数,然后在信息位后添n=3加个0。即:101001000

        然后进行除法运算:

        

得到的余数是n=3个位。

        运算方法: 模二除。

 只看首位,是1就x1进去:

再对1后面的三位010与101进行异或,在得到的结果后面添加信息位的下一个位:

        

如果遇到第一位是0,那么就x0进去,得到了0000,再进行后三位的异或:

        

以此类推,最后会得到3bit位的余数,这3位的余数,就是我们添加到信息位后的校验位:

        

最后得到了CRC码:

到了这里,我们再说说生成多项式:

        1.校验位数和生成多项式是有着关系的,生成多项式的最高次幂是校验位的位数。

        2.生成多项式位数越多,在得到校验位的计算上,信息位后面需要补更多的0,位数变多了,计算量也就变大了,同时储存它们的空间也需要变大。

        3.不及如此,生成多项式位数越多,除数也会变多。因为除数就是生成多项式。

CRC码的校验:

        接收方收到发送方的CRC校验码时,需要对CRC校验码进行校验。

生成多项式是接收方和发送方一起规定的,因此都会知道这个生成多项式。

        校验方式还是:模二除

        还是将生成多项式作为除数,接收的CRC校验码作为被除数。        

        

尝试未出错时的计算:

发现:最后的余数是000,说明信息未发生改变。

尝试发生改变时的计算:

        

发现:得到了010的余数,不为000说明发生了错误。

CRC码的纠错问题:

        根据上图中余数是010,而出错位置也是010。那么余数真的表示出错位置吗?

        算出每个出错位置,以及对应的余数,得到一个表格:

        

        上图发现余数为001和010的位置有两处。显然在这里余数并不能表示出错位置。

        图中用余数表示出错位置,余数只有3位,只有2^3=8种状态,其中000是其中的一种用来表示正确状态,其余7种表示错误状态。

        所以我们知道,余数3位只能表示7种错误位置。也就是到图中第七位的错误为止。

        我们会发现这里不能纠错的原因是:第八位和第九位的存在,导致只有3位的余数,不够表示错误位置。

        那我们如果减少信息位,让CRC码只有7位,那么余数的7种状态就完全可以一一对应,使得拥有纠错的能力。

                

减少信息位例题:

信息位只有4位,生成多项式还是1101,得到的CRC码只有7位。

此时再看图:

该信息位置与余数一一对应,这样当我们知道余数时,就可以知道错误位置再哪了。

        以上是减少信息位,显然现实中,减少信息位肯定是不可能的。发送的信息是人规定死的。机器不能减少。

        因此机器会选择增多余数,这样余数增多,所能表示的位数就越多。虽然余数和校验位位数是一样的,但是校验位数的增多绝对赶不上余数表示错误位置的数量。

        巩固记忆:生成多项式最高次幂,可以表示:1.计算校验位时,需要再信息位添加0的个数。2.校验位个数。3.进行校验所得到的余数。

         生成多项式无论在获取校验码或是进行校验时,都作为除数。

       比如:0100010余数有3bit,表示7种错误位置。刚好全部可以表示

                01000101余数有4bit,可以表示2^4=16种状态,还有8种状态冗余

                010001010余数有5bit,可以表示2^5=32种状态,还有23中状态冗余。

        由此,我们就可以知道,余数越多纠错能力就越强。

       回到生成多项式:

        我们知道余数和生成多项式有关,进而说明了生成多项式越多位,就能够进行更多的纠错,所以文章开头说生成多项式的时候说:按需求而定,是想要纠错呢?还是单纯检错?

到此可以回看上面的生成多项式,这样你可以完全明白生成多项式这个东西

        

学完循环冗余校验码,更需要知道它的引用领域:

        循环冗余校验码通常只会用在计算机网络当中,且在OSI七层模型架构中的数据链路层。

        而且,一般不会用到它的纠错能力,只会用到检错能力。

        

知识回顾:

循环冗余校验码的由来(只是补充,不学也行):

将余数作为被除数,生成多项式作为除数。

         在余数后面补一个0,保证余数个数和生成多项式位数一样。

        

由此进行模二除的运算:

        

        会发现:得到的余数010是CRC码第二位错误时的余数。继续往下:

发现余数又是下一个位置出错的余数。继续往下:

发现101又是下一个

当你继续算下去会发现会算到110,然后继续算时又会回到001,就这样一直往复,一直循环

        因此就叫做:循环冗余校验码

        

计算机底层:循环冗余校验码CRC相关推荐

  1. 第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 [计算机组成原理笔记]

    第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 本笔记参考书目: 计算机组成原理(第六版.立体化教材)白中英.戴志涛 2021王道计算机组成原理视频公开课 本节重点: 循环冗余校验码/ ...

  2. 循环冗余校验码CRC,求解步骤

    循环冗余校验码CRC,是软考-计算机组成原理 中一种重要的编码. 下面只是简要描述求解CRC码的解题步骤,面向有一定理论基础的朋友. 直接看例题. 例.信息位: 10100110   生成多项式: 解 ...

  3. 计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索

    笔者在阅读华中科技大学谭志虎老师主编的<计算机组成原理(微课版)>教材进行复习时,产生了一个疑问,并针对性地进行了一些思考.欢迎广大复习到这里同样有问题的同学(寒假开学接着考试实在有点汗, ...

  4. 循环冗余校验码CRC原理和实例

    今天同事问了一个CRC(循环冗余校验码)的问题,好奇心之下学习了一下. 首先说它的原理,百度百科上也有,我就简单说一下,它其实就是采用多项式编码的方法,对于要发送的信息码R,发送方和接收方约定好多项式 ...

  5. 计算机系统基础知识——循环冗余校验码(CRC)

    前言:循环冗余校验码(cyclie redundancy check)简称CRC(循环码),是一种能力相当强的检错.纠错码,并且实现编码和检码的电路比较简单,常用于串行传送(二进制位串沿一条信号线逐位 ...

  6. java生成冗余校验码_对循环冗余校验码CRC的理解

    模2加法 1+1=0, 0+1=1, 1+0=1, 0+0=0 模2减法 1-1=0, 0-1=1, 1-0=1, 0-0=0 相当于二进制中的逻辑异或运算.也就是比较后两者对应位相同则结果为&quo ...

  7. 【校验码 - 循环冗余校验码CRC】

    水善利万物而不争,处众人之所恶,故几于道

  8. 计算机组成原理学习笔记:循环冗余校验码

    循环冗余校验码 CRC 码 循环冗余校验码 (cyclic redundancy Check, CRC) 十进制除法 从熟悉的十进制出发,假设现在你要给另一个人传送882这样的一个10进制数据,为了防 ...

  9. CRC冗余校验码源码代码c语言,循环冗余校验码(CRC)应用总结(包括C++源码)

    最近在实习期间需要用到数据的校验,所选为CRC16,那么就在此总结一番吧. 现在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用 ...

最新文章

  1. 【 NLS 】Newton – Raphson Iteration Procedure of TOA - Based Positioning
  2. 数据库学习day_02:表格相关sql语句 / 表格数据相关sql语句 / sql中的数据类型 / 导入外部sql文件 / 去重.是否为null.and与or.in.[x,y]
  3. bigtall的敏捷日记(1)
  4. js html 追加span内容,使用JavaScript显示SPAN的内容
  5. marc数据个人心得
  6. Android 开发之 GridView及其事件监听
  7. 上传文件返回数据提示下载
  8. 开启进度比的文本为什么没有显示_没有开通智钻,为什么会显示流量是在智钻进店的呢?...
  9. 时间设置偏移秒_零偏移有源低通滤波器,第2部分
  10. Chrome Workspace开发者调试工具
  11. 【报告分享】2021制造业与人工智能创新应用发展报告.pdf(附下载链接)
  12. SPSS描述性统计--非连续变量的描述统计
  13. 【P44】DC-DC隔离模块,解决蓝牙共地干扰问题
  14. oracle数据库赋权
  15. 「读书笔记」余生,请多指教
  16. 【原创】产品型IT公司向服务型公司转型
  17. 小学计算机教案动画欣赏,小学信息技术Flash动画教学反思
  18. “智能对话机器人”离“智能”还有多远?
  19. 你可能不知道的css-doodle
  20. PowerDesigner 把设计图导出成图片

热门文章

  1. npm修改为淘宝镜像
  2. 名编辑电子杂志大师教程 | 添加功能按钮
  3. 获取iPhone手机的内存信息
  4. UESTC 1599 wtmsb【优先队列+排序】
  5. BufferPool缓存机制
  6. 华为可以分屏吗_若华为启用“鸿蒙”,那原来安卓系统的手机,可以更换新系统吗?...
  7. mac idea 创建 springboot 项目
  8. 7-96 干饭人(排序 快读
  9. Apache Dubbo RSocket Gateway 入门教程
  10. [附源码]java毕业设计音乐交流平台