校验码
能够发现错误或者自动纠错的数据编码,也称为检错纠错码。校验码的原理是通过增加一些冗余码,来检错或纠错编码。
任意两个合法码字之间的最少变化的二进制位数,叫做码距。码距越大,检错、纠错能力越强,且检错能力>=纠错。
码距大于等于2的数据校验码,开始具有检错能力。
三种常见的校验码:
1、奇偶校验码
在首部增加一位二进制位(校验位),称为奇偶校验码,它可以检测出一位错误,而且只能是奇数位错误。它的码距为2。
通过数有效信息位和校验位的“1”的个数来判断是奇校验码还是偶校验码。奇校验码中1的总个数为奇数,偶校验码中1的个数为偶数。
缺点:具有局限性,只能检测出奇数位(比如3个数位)出错的情况,通过编码中1的个数的变化判断是都出错,但不能确定出错的位置,也不能纠正错误。
2、海明码:多重奇偶校验码,具有纠错能力。
能发现两位错误,纠正一位错误。
假设数据有n位,校验码有m位。则校验码一共有 2 m 2^m 2m种取值方式。其中需要一种取值方式表示数据正确,剩下 2 m − 1 2^m-1 2m−1种取值方式表示有一位数据出错。因为编码后的二进制串有n+m位,因此m应该满足:
2 m − 1 ≥ n + m 2^m-1 ≥ n+m 2m−1≥n+m
求海明码的具体步骤
看例子:
【例】在n = 4,k = 3时,求1010的海明码?
1、确认海明码的位数:
在这里,n是有效信息位数,k是校验位数,应满足n+k+1<=2^k ,把k、n带入发现是有效的。
设信息位为D4D3D2D1(1010),共4位,校验位有3位,设为P3P2P1。
对应的海明码为:H7H6H5H4H3H2H1,共7位(这只是说明有7个码组成,并没有确定具体每一位的值和属性)
2、确定校验位的位置:
规定校验位Pi(1<=i<=k)在海明位号为2^(i-1)的位置,其余为信息位。因此P1在海明位号为1的位置,即H1;
P2在编号为2的位置,即H2;P3在编号为4的位置,即H4;
海明码的分布为:D4D3D2P3D1P2P1(海明位号每位在序列H7H6H5H4H3H2H1中对应的下标数字,例如D2的海明位号为5)
3、分组,形成校验关系:
每个数据位用多个校验位进行校验,满足条件是:数据位的海明位号等于校验它的校验位的海明位号之和。
只需要看数据位就行了。比如:D1放在H3的位置上,3 = 0011由P1P2进行校验,因为P2P1的海明位号为2+1=3;
D2放在了H5上,就要由和是5 = 0101的校验位来校验,发现是片P1P3,因为他们的海明位号和为4+1=5;
D3放在了H6上,找和为6 = 0110的校验位,是P2P3,海明位号分别为4和2,4+2-6。
D4放在了H7,找和为7的校验位,发现7 = 0111,对应是P1P2P3,同理因为4+2+1=7。
4、校验位取值(也称编码):
校验位Pi(1<=i<=k)的值为 被Pi校验过的数据位的异或值。
P1 = D1⊕D2⊕D4 = 0⊕1⊕1 = 0;
P2 = D1⊕D3⊕D4 = 0⊕0⊕1 = 1;
P3 = D2⊕D3⊕D4 = 1⊕0⊕1 = 0;
所以,1010对应的海明码为101(0)0(10)。小括号内为校验位。
5、译码方程,即用一个校验位和形成这个校验码的编码方程执行异或,通过检查S的结果,可以实现纠错检错的目的。若出错的数据位,对其求反则实现纠错,若出错的是校验位,不必理财。找出错误位置。
S1= P1⊕D1⊕D2⊕D4 = 0;
S2,S3类似……,若S3S2S1 = 000那么说明没出错;否则S3S2S1值为几就是那一位出错,
例如S3S2S1 = 001,则说明第一位出错,直接将该出错位取反就达到了纠错的目的。
3、循环冗余校验码Cyclic Redundancy Check,CRC:
在k位信息码后面增加r位校验码,整个编码长度为n。又称(N,K)码
(注意k和海明码代表的意义不一样)
能发现并纠正信息穿读写、存储、传送过程中的一位或者多位错误。
原理
基于线性编码理论,在发送端,将要发送的k位二进制信息码,向左移动r位,将它与生成多项式G(x)做模2除法,生成一个r位校验码,并附在信息码后面,构成一个新的二进制码(CRC)。共有K+R位。在接收端,利用生成多项式对接收到的编码做模2除法,以检测出错的位置,如无错误则删除。
生成多项式G(x)是发送端与接收端的一个约定。G(x)的最高项为R,则转化为二进制数有R+1位。
例子
生成多项式G(x),做模2除法。
G(x) = x^3 + x^2 + 1,信息码为101001,求其CRC码?
1、生成多项式的最高次幂是3,则说明r = 3。由题意知k = 6,n = k + r = 9。G(x)对应的二进制码为 1101
2、移位,将原信息码向左移r位,低位补零,得到101001000
3、相除,模2除法,产生余数,也就是异或运算。将上一步得到的移位码对G(x)的二进制码做模2运算。
当每一步异或之后得到的余数最高位为1时,商为1,最高位为0,商为0。除数右移,跟除法运算差不多。
当余数位数小于除数(1101)的时候,该余数是最终余数。把这个余数加到信息位的最后,得到CRC码。
4、检错纠错。将得到的CRC码和生成多项式做模2除法,如果余数为0,则没出错。
否则哪一位不为0,哪一位就出错了,取反即可。