本文包含奇偶,海明,循环冗余校验码
校验背景
当两台设备在通信的时候,由于许多不可控因素,接收方收到的信息不一定是发送方发出的信息,即传输过程中信息发生了改变。那么我们就需要添加一些校验的方法来帮助我们确定收到的信息是否正确。这便是校验发生的背景。
一些基本概念
码字:指我们通过一系列二进制代码表示的信息,通常是人为定义的(如令 A为011 )
码距:两个合法码字对应位上数字的不同位的个数(如001和010的码距为2)
奇偶校验
奇校验
定义:在开头添加一位数保证一段数据中出现奇数个1
如:
010 -> 0010
011 -> 1011
偶校验
定义:在开头添加一位数保证数据中出现偶数个1
如:
001 -> 1001
011 -> 0011
但是不管是奇校验还是偶校验,他们都不能完全保证数据的正确性,如果一次性跳变两位,他们还是无法检测出数据是否正确。同时他们也不能定位跳变的位置。
海明校验码
海明码设计思路:通过分组校验和多个校验位来标注出错位置
假设我们的校验位为k位,信息位为n位。我们的校验位可以表示种状态。
如果要表示所有状态,那么我们就需要保证
以下是n和k的对应关系

海明码求解方法
以1010为例
1.确定海明码位数
由可知,我们的
,所以海明码的位数为7位
2.确定校验位的分布
校验位应当放在
的位置上,所以三位校验位应该放在1,2,4三个位置上
然后信息位按顺序放在其余位置(如果你想反过来放也可以,计算出来的结果也是对应下表的)

3.计算校验位
校验位由信息位计算得出:
因为信息位分别放在7,6,5,3几个位置上(其他位置被校验位占了),所以对这些数进行异或运算来计算出校验位。如下图,D是信息位

所以我们得到的海明码就是1010010
校验过程
校验就是将校验位和接受到的信息位进行异或运算

假设我们接受到1010010,即数据没有变化,那么我们计算出来的S1 = S2 = S3 = 0,即我们的数据是正确的。
如果接收到1010000,我们的S1 = 0 , S2 = 1 , S3 = 0,所以第二位出错。
循环冗余校验码(CRC码)
一般来说,求解CRC码时,会提供生成多项式和信息码。
CRC码的结构一般是K位信息位加上R位校验位
如何根据生成多项式得到对应的二进制码
当生成多项式为
其对应的二进制码就为10111
求解CRC码
先根据生成多项式得到二进制码
将信息码左移R位,低位补0
我们将得到的二进制码对位移后的信息码进行模2除法,产生的余数即为校验码
假设我们的信息码为101001,二进制码为1101,计算步骤如下:

于是我们的CRC码就为101001 001
纠错
接收方将收到的CRC码用二进制码(生成多项式的)进行模2除法
如果余数为0,则正确
反之余数指向的位出错(这个要看生成多项式给的合不合理)
