一下子看懂校验码,CRC,海明码

校验码

能够发现错误或者自动纠错的数据编码,也称为检错纠错码。校验码的原理是通过增加一些冗余码,来检错或纠错编码。
任意两个合法码字之间的最少变化的二进制位数,叫做码距。码距越大,检错、纠错能力越强,且检错能力>=纠错。

码距大于等于2的数据校验码,开始具有检错能力。

三种常见的校验码:

1、奇偶校验码

在首部增加一位二进制位(校验位),称为奇偶校验码,它可以检测出一位错误,而且只能是奇数位错误。它的码距为2!
通过数有效信息位和校验位的“1”的个数来判断是奇校验码还是偶校验码。

缺点:具有局限性,只能检测出奇数位(比如3个数位)出错的情况,不能确定出错的位置,也不能纠正错误。

2、海明码:多重奇偶校验码,具有纠错能力。

能发现两位错误,纠正一位错误。
求海明码的具体步骤

看例子:

【例】在n = 4,k = 3时,求1010的海明码?

1、确认海明码的位数:

在这里,n是有效信息位数,k是校验位数,应满足n+k+<=2^k ,把k、n带入发现是有效的。
设信息位为D4D3D2D1(1010),共4位,校验位有3位,设为P3P2P1。0
对应的海明码为:H7H6H5H4H3H2H1,共7位(这只是说明有7个码组成,并没有确定具体每一位的值和属性)

2、确定校验位的位置:

规定校验位Pi(1<=i<=k)在海明位号为2^(i-1)的位置,其余为信息位。因此P1在海明位号为1的位置,即H1;
P2在编号为2的位置,即H2;P3在编号为4的位置,即H4;
海明码的分布为:D4D3D2P3D1P2P1(海明位号就是这个序列的下标数字)

3、分组,形成校验关系:

每个数据位用多个校验位进行校验,满足条件是:数据位的海明位号等于校验它的校验位的海明位号之和。
只需要看数据位就行了。比如:D1放在H3的位置上,由P2P1进行校验,因为P2P1的海明位号为2+1=3;
D2放在了H5上,就要由和是5的校验位来校验,找一下发现是P3P1,因为他们的海明位号和为4+1=5;
D3放在了H6上,找和为6的校验位,是P2P3,海明位号分别为4和2。D4放在了H7,找和为7的校验位,
发现是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、找出错误位置。

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,哪一位就出错了,取反即可。

猜你喜欢

转载自blog.csdn.net/qq_38232598/article/details/80976224