【直观对比】奇偶校验 累加和校验 CRC校验

奇偶校验:

所谓通讯过程的校验是指在通讯数据后加上一些附加信息,通过这些附加信息来判断接收到的数据是否和发送出的数据相同。比如说RS232

串行通讯可以设置奇偶校验位,所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个或偶数个。比如我们要

发送的字节是0x1a,二进制表示为0001 1010。

采用奇校验,则在数据后补上个0,数据变为0001 1010 0,数据中1的个数为奇数个(3个)

采用偶校验,则在数据后补上个1,数据变为0001 1010 1,数据中1的个数为偶数个(4个)

接收方通过计算数据中1个数是否满足奇偶性来确定数据是否有错。(这种方式的正确率不高,一旦发生偶数个比特位错误就无法检测出来


累加和校验:


另一种常见的校验方式是累加和校验。所谓累加和校验实现方式有很多种,最常用的一种是在一次通讯数据包的最后加入一个字节的校验数

据。这个字节内容为前面数据包中全部数据的忽略进位的按字节累加和。比如下面的例子:

我们要传输的信息为: 6、23、4

加上校验和后的数据包:6、23、4、33

这里 33 为前三个字节的校验和。接收方收到全部数据后对前三个数据进行同样的累加计算,如果累加和与最后一个字节相同的话就认为传输的数据没有错误。

累加和校验由于实现起来非常简单,也被广泛的采用。但是这种校验方式的检错能力也比较一般,对于单字节的校验和大概有1/256 的概率将

原本是错误的通讯数据误判为正确数据。之所以这里介绍这种校验,是因为CRC校验在传输数据的形式上与累加和校验是相同的,都可以表示

为:通讯数据 校验字节(也可能是多个字节)


CRC校验:

CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。还以上

面例子中的数据为例:

[cpp]  view plain  copy
  1. 1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。  
  2.   
  3. 2、将信息码左移R位,相当于对应的信息多项式C(X)*2R。  
  4.   
  5. 3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。  
  6.   
  7. 4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。  
  8.   
  9. 【例】假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求编码后的报文。  
  10.   
  11. 解:  
  12.   
  13. 1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。  
  14.   
  15. 2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010000  
  16.   
  17. 3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或:  
  18.   
  19. 1010000  
  20.   
  21. 1011  
  22.   
  23. ------------------  
  24.   
  25. 0001000  
  26.   
  27. 1011  
  28.   
  29. ------------------  
  30.   
  31. 0011  
  32.   
  33. 得到的余位011,所以最终编码为:1010011  

猜你喜欢

转载自blog.csdn.net/guomutian911/article/details/78602385