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

校验码

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

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

三种常见的校验码:

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

缺点:具有局限性,只能检测出奇数位(比如3个数位)出错的情况,通过编码中1的个数的变化判断是都出错,但不能确定出错的位置,也不能纠正错误。

2、海明码:多重奇偶校验码,具有纠错能力。
能发现两位错误,纠正一位错误。

假设数据有n位,校验码有m位。则校验码一共有 2 m 2^m 2m种取值方式。其中需要一种取值方式表示数据正确,剩下 2 m − 1 2^m-1 2m1种取值方式表示有一位数据出错。因为编码后的二进制串有n+m位,因此m应该满足:

2 m − 1 ≥ n + m 2^m-1 ≥ n+m 2m1n+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,哪一位就出错了,取反即可。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antrn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值