通俗易懂的CRC循环校验

CRC循环校验

CRC编码,也称为多项式编码。它是在数据通信中常用的一种差错校验码。由信息字段和校验字段组成。其中信息字段和校验字段长度可以任意选定。

先来看看CRC校验的原理:


在发送方要将d比特的数据D发送给接收方,所以

1、先提前制定一个协议,就是双方先协商一个r+1比特模式,叫做生成多项式,用G来表示,要求G的最高比特为必须为1。

 
2、在发送端先给数据位(例如D:110101)后面补上(G-1)个0,得到一个帧,这里的G就是提前协商好的(例如x^4+x^3+1,转换为2进制就是11001,然后将4个0加在D的后面,帧就变为了1101010000),然后进行让新的数据位对生成多项式进行“模二除”运算,最后的到的余数就是CRC校验码(注意这里的到的CRC校验码必须是G-1位,如果的到的高位是0也要写上),然后将得到的CRC校验码替换刚刚添加的G-1个0。这样就得到了一个新的帧。 


3、然后将新帧和生成多项式进行封装传给接收端。接收端在收到包后将新帧和生成多项式拿出来。然后执行和发送端一样的运算,对生成多项式对应的二进制进行模二除,如果最后得到的余数为0,则说明在传输过程中没有出错。否则就是出错。而且具体还能检查到哪一位出错了。

我们现在现将上面举的例子来解析一下 
首先,数据位为110101,生成多项式为x^4+x^3+1,则转换的的二进制就是11001,那么生成的帧就是1101010000(为什么是这样上面有说道),然后先进行模二除,得到余数就是CRC校验码 
先来看看什么是模二除运算 
模二除简单来说就是二进制比特位按位异或,都知道除法在除的时候不够除时要像高位借位,而模二除只是当前比特位的异或,不涉及到借位。 
只要二进制比特位相同就商1,不够就商0。 
现在就将上面的式子进行模二除


以前的通信基础理论老师曾经说过:“CRC校验是我们通信人的骄傲”。那么为什么CRC校验码这么好呢?就是因为他能够在接收端检测出在传输过程中出现错误了,并且能够够检测出来,所以说他很强大,那么现在就来解析一下为什么能够具体检测到某一位错误(实际上一次可以检测出多位出错) 
刚刚上面的那个模二除就是在发送端做的事,最后得到一个帧1101011101,然后传给接收端,如果要是在传输过程中没有出错,那么用1101011101模二除11001,得到的余数肯定是0,要是其中某一位出错了,那么肯定实在传输的时候出现了错误,导致异常。CRC校验到底是如何检测出错位的位呢?现在假设接收端收到的帧为1101111101,也就是从左到右第五位的0变为了1,现在再用模二除来计算一下。


所以在接收方根据得到的余数反推回去就得到了错误的比特位在哪。

总结一下:CRC校验码就是利用发送方和接收方提前协商好一个生成多项式,然后通过得到的数据帧模二除这个生成多项式对应的二进制序列,在接收方如果得到的余数为0,则说明传输中没有出现错误,否则就会出现错误。

猜你喜欢

转载自blog.csdn.net/prokgtfy9n18/article/details/74855834
今日推荐