一道题带你搞懂CRC循环冗余校验是如何纠错的, 体会CRC的奇妙之处, 献给充满好奇心的你.

引言

想必看到这片文章的同学,已经对CRC校验码的生成过程和理论依据如数家珍,但是CSDN上却很少有详细讲述CRC是如何纠错的。关于CRC校验码生成的理论,前人之述备矣,我也就不赘述了,不了解的同学可以在CSDN上搜索CRC相关知识。下面以一道例题来把CRC检验的整个过程讲述一遍,重点是讲述如何纠错。
至于CRC能不能纠错,可以参见下面这两篇文章
循环冗余码CRC可不可以纠错
计组与计网数据编码之数据保证—奇偶校验,汉明码(海明码)与循环冗余码CRC以及异或的应用、看完之后做题不迷茫

例题

现在我们拥有信息位1100生成多项式G(X)=1011,通过模2除生成校验码1100010,对此有如下表格,即不同出错位与余数的对应表,实际上计算机并不知道这个表格,这个表格是我们人为计算的得出的,计算机仅仅知道此情况下第一位出错的余数是101。
某生成多项式和信息位所产生的余数对应出错位的表格
现在假设接受到的校验码是1100011,这个数与G(X)=1011作模二除结果是001,与我们发送的校验码1100010相比较,很明显最后一位出错了,我们用下划线标注上这一位。用于观察计算过程中这一位的变化情况。事实上,计算机不知道001对应哪一位出错了,计算机只知道第一位出错的余数是101(注意,文末有对这句话的解释,先搞懂整个流程怎么做的,再去探究细节原因

提前说明几点问题
1.纠错利用的原理是出错状态的下的余数补0后,继续与G(X)进行模二除,重复操作会产生循环。
2.循环左移是指,把校验码往左移,校验码最左边的一位移动到最右边,直观上就像是一个环庄,所以叫循环左移.
看到这里你可能还不懂,没关系,通过一个例子,你就肯定会明白了。

开始纠错

情况说明校验码当前情况运算余数
发现出错,开始纠错11000111100011与G(X)模二除001
校验码循环左移,同时余数001补0,成为0010,与G(X) 模二除10001110010与G(X)模二除010
校验码循环左移,同时余数010补0,成为0100,与G(X) 模二除00011110100与G(X)模二除100
校验码循环左移,同时余数100补0,成为1000,与G(X) 模二除00111101000与G(X)模二除011
校验码循环左移,同时余数011补0,成为0110,与G(X) 模二除01111000110与G(X)模二除110
校验码循环左移,同时余数110补0,成为1100,与G(X) 模二除11110001100与G(X)模二除111
校验码循环左移,同时余数111补0,成为1110,与G(X) 模二除11100011110与G(X)模二除101
发现当前余数位101,已知101代表第一位出错,把第一位与1进行异或运算(或取反运算),纠错0110001无运算
校验码循环左移,同时余数101补0,成为1010,与G(X) 模二除11000101010与G(X)模二除001
此时发现余数已经回到了原来的001,说明循环左移移动了一圈,同时在出错位移动到第一位的时候我们把出错位纠正了,现在原本出错的位置又回到了原来的地方,并且数据也已经更正了。结果为110010与我们的发送的原校验码一致。

基本思想

现在我们可以总结纠错的基本思想

  1. 不论出错在哪一位,均要通过出错位循环左移到最左边一位上来进行纠正。
  2. 不为0的余数具有循环特征,即在余数后面补上一个0后除以多项式,将得到下一个余数。继续在新余数的基础上补零除以生成多项式,重复该操作,最终余数能循环到最开始的余数,CRC由此得名。
  3. CRC就是利用不为0余数的循环特性,在循环计算余数的同时,将收到的CRC编码同步循环左移,当余数循环到等于最左边位出错对应的余数时,表明出错位已经移到了CRC码的最左边,对出错位进行纠错
  4. 继续进行余数的循环计算,并同步移动CRC编码,当余数回到最开始的值时,纠错后的CRC码也回到了最开始的位置。至此,纠错任务完成。

附录

因为上面并没有具体的计算过程,需要大家手动算,下面把我的计算过程附上。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

感受

CRC的纠错过程才是其精髓所在,了解之后不由的感叹:“妙不可言,计算机前辈们都是神级大佬”。最后,祝愿大家好好学习,变得更强。

补充

至于计算机是怎么知道第一位出错时的余数,可以参见下面这篇文章,写的很好
计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索

### 回答1: CRC循环冗余校验)是一种常用的错误检测技术。CRC主要通过附加一个固定长度的校验码到数据中,来检测数据在传输过程中是否发生了错误。在CRC中,校验码是通过对数据进行除法运算得到的。 具体而言,给定一个二进制的数据块D,CRC会附加一个n位的校验码C到数据末尾,形成一个新的数据块D'C。校验码C被设计为使得D'C能够被一个特定的生成多项式G整除,如果在传输过程中发生了错误,这个多项式无法整除D'C,因此可以通过检查余数来判断是否发生了错误。 CRC的关键是选择适当的生成多项式G。常见的生成多项式包括CRC-8、CRC-16和CRC-32等。不同的生成多项式会产生不同长度的校验码,长度越长,检测到错误的可能性越高。 在进行CRC运算时,接收方会将接收到的数据块D'C除以生成多项式G。如果余数为0,则表明没有错误;如果余数不为0,则表明发生了错误。在这种情况下,接收方可以向发送方请求重新发送数据,以确保数据的正确性。 总而言之,CRC是一种通过附加校验码到数据中的方法,可以有效地检测传输过程中的错误。通过选择适当的生成多项式,可以提高CRC的检测能力。 ### 回答2: CRC循环冗余校验)是一种常见的错误检测技术,用于检测数据传输过程中是否发生了错误。它使用多项式除法的原理,将输入数据与生成多项式进行模2除法运算,得到校验码,然后将校验码附加到原始数据中进行传输,接收方再次进行CRC运算并检查校验码是否匹配,从而判断数据是否出现错误。 CRC算法主要基于封闭性和循环性的原则,它将传输的数据看作二进制数,使用一个生成多项式进行除法运算。该生成多项式在CRC算法中是固定的,不同的生成多项式对应不同的CRC校验码。一般情况下,生成多项式选取低于数据位数的最高次项为1,其余项为0。 CRC过程中,首先需要进行数据的比特填充,即将数据位数按照生成多项式的次数进行扩展,扩展的位数是生成多项式的位数减1。然后进行模2除法运算,逐位比较输入数据和生成多项式的对应位,若两位相同,则结果为0,否则为1。运算结束后得到CRC校验码,然后将其附加到原始数据后面,发送给接收方。 接收方收到数据后,同样经过除法运算得到接收到的校验码。如果接收到的校验码与发送方计算的校验码相同,说明数据传输过程中没有发生错误。如果两个校验码不匹配,则表示数据存在错误,需要重传或进行其他处理。 CRC循环冗余校验是一种简单、高效且广泛应用的错误检测技术,它能够检测发生在数据传输过程中的大多数错误,并且具有较低的错误漏检率和错误检测率。在网络通信、存储系统、计算机硬件等领域广泛应用,能够确保数据的完整性和可靠性。 ### 回答3: CRC循环冗余校验)是一种常用的数据校验方法。在计算机通信和存储中,为了确保数据的完整性和准确性,我们经常需要对数据进行校验。CRC是通过对数据进行除法运算来实现的。 CRC校验的基本原理是,将数据看作二进制多项式,然后利用除法运算来计算其余数。具体步骤如下: 1. 将待校验的数据表示为二进制形式,并在最高位补充k个0,其中k为CRC校验码的位数。 2. 选择一个固定的生成多项式G(x),作为除数。该多项式的系数即为CRC校验码的系数。 3. 将生成多项式G(x)左移k位,与待校验数据相异或。 4. 重复步骤3,直到所有数据位都被处理完。 5. 最后所得结果就是校验码,可以将其附加在原始数据后面发送。 6. 接收方根据接收到的数据,再次进行CRC校验。如果余数为0,则认为数据没有出错;反之,则认为数据出错。 CRC可以提供较高的校验效率和误码检测能力,常被应用于计算机网络、存储器、传感器等领域。它的优点是计算简单、校验速度快,并且能够检测到多种错误,包括单比特差错、双比特差错和突发差错等。 总而言之,CRC循环冗余校验是一种常用的数据校验方法,通过除法运算来计算校验码,并能够高效地检测数据的错误。它在通信和存储领域发挥着重要作用,确保了数据的完整性和可靠性。
评论 65
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值