海明码

海明码简介:

具有纠正一位错误的能力

1.    计算校验位数

它是这样的规定的:假设用N表示添加了校验码位后整个信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位,它们之间的关系应满足:N=Kr≤2r1


2.确定校验码位置
校验码必须是在2n次方位置,如第1、2、4、8、16、32,……位(对应20、21、22、23、24、25,……)

3.    确定校验码

  举一个例子,假设现有一个8位信息码,即b1、b2、b3、b4、b5、b6、b7、b8,它需要插入4位校验码,即p1、p2、p3、p4,也就是整个经过编码后的数据码(称之为“码字”)共有12位。根据以上介绍的校验码位置分布规则可以得出,这12位编码后的数据就是p1、p2、b1、p3、b2、b3、b4、p4、b5、b6、b7、b8。


例题一、现有7位信息代码:0110001,求它的海明码,用偶校验的方法。

海明码共n+k=7+4=11位                           (3分)

11  10  9   8    7  6   5   4    3    2     1  

×   ×   ×  P4   ×  ×  ×   P3   ×    P2   P1

P1:3,5,7,9,11   10010 0

P2:3,6,7,10,11  10010 0

P3:5,6,7  000 0

P4:9,10,11  110 0

所以 P1=0 P2=0  P3=0  P4=0                  (5分)

可得

海明码为01100000100     (2分)


   

4.    实现校验和纠错

    虽然上一步已把各位校验码求出来了,但是如何实现检测出哪一位在传输过程中出了差错呢?(海明码也只能检测并纠正一位错误)它又是如何实现对错误的位进行纠正呢?其实最关键的原因就是海明码是一个多重校验码,也就是码字中的信息码位同时被多个校验码进行校验,然后通过这些码位对不同校验码的联动影响最终可以找出是哪一位出错了。

1)海明码的差错检测

    现假设整个码字一共是18位,根据表5-1可以很快得出,其中有5位是校验码,再根据本节前面介绍的校验码校验规则可以很快得出各校验码所校验的码字位,如表5-2所示。

    表5-2  各校验码校验的码位对照表


      从表中可以得出以下两个规律:

  •      所有校验码所在的位是只由对应的校验码进行校验,如第1位(只由p1校验)、第2位(只由p2校验)、第4位(只由p3校验)、第8位(只由p4校验)、第16位(只由p5校验),……。也就是这些位如果发生了差错,影响的只是对应的校验码的校验结果,不会影响其它校验码的校验结果。这点很重要,如果最终发现只是一个校验组中的校验结果不符,则直接可以知道是对应校验组中的校验码在传输过程中出现了差错
  •    所有信息码位均被至少两个校验码进行了校验,也就是至少校验了两次。查看对应的是哪两组校验结果不符,然后根据表5-2就可以很快确定是哪位信息码在传输过程中出了差错。

      海明码校验的方式就是各校验码对它所校验的位组进行“异或运算”,即:

G1=p1⊕b1⊕b2⊕b4⊕b5⊕……

G2=p2⊕b1⊕b3⊕b4⊕b6⊕b7⊕b10⊕b11⊕……

G3= p3⊕b2⊕b3⊕b4⊕b8⊕b9⊕b10⊕b11⊕……

G4= p4⊕b5⊕b6⊕b7⊕b8⊕b9⊕b10⊕b11⊕……

G5= p5⊕b12⊕b13⊕b14⊕b15⊕b16⊕b17⊕b18⊕b19⊕b20⊕b21⊕b11⊕b23⊕b24⊕b25⊕b26⊕……

    正常情况下(也就是整个码字不发生差错的情况下),在采用偶校验时,各校验组通过异或运算后的校验结果均应该是为0,也就是前面所说的G1、G2、G3、G4,……均为0,因为此时1为偶数个,进行异或运算后就是0;而采用奇校验时,各组校验结果均应是为1


例题一、假设传输的海明码为111000111101(一共12位,带阴影的4位就是校验码),从中可以知道它有四个校验组:G1、G2、G3、G4,然而到达接收端经过校验后发现只有G4=1(也就是只有这组校验结果不等于0),通过前面介绍的校验规律可以很快地发现是G4校验组中的p4校位码(也就是整个码字中的第8位)错了(因为只有一组校验结果出现差错时,则肯定只是对应的校验位出了差错),也就是最终的码字变成了:111000001101。

   

    再假设G3、G4两个校验值都不为0,也就是都等于1。通过表5-2中比较G3、G4两个校验组(注意本示例中码字长度一共才12位,只需要比较前12位)中共同校验的码位可是以很快发现是b8,也就是第12位出现了差错,也就是最终的码字变成了:111000011100

    【经验之谈】在这里一定要注意,最终有多少个校验组出现差错也不是随意的,一定要结合实际传输的码字长度来考虑。如上例是一共12位,如果换成了是16位的码字,且当b9位出现差错时,则G1、G3、G4一定会同时出现错误,因为b9这个位是三个校验组同时校验的,只要它一出错,肯定会同时影响这三个校验组的值。同理,如果是b11位出现了差错,因为它同时受G1、G2、G3、G4四个校验组校验,所以这四个校验组结果都将出现错误。

    2)海明码的差错纠正

    检测出了是哪位差错还不够,因为海明码具有纠正一位错误的能力,所以还需要完成纠错过程。这个过程的原理比较简单,就是直接对错误的位进行取反,或者加“1”操作,使它的值由原来的“1”变成“0”,由原来的“0”变成“1”(因为二进制中每一位只能是这二者之一)。

转自:

上篇:http://blog.csdn.NET/lycb_gz/article/details/8214961 

下篇:http://blog.csdn.net/lycb_gz/article/details/8232684

    以下内容摘自笔者最新出版的最新著作《深入理解计算机网络一书:http://item.jd.com/11165825.html



  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值