海明码(简单易懂)

4人阅读 评论(0) 收藏 举报

之前看网上有一篇关于海明码的博客,浏览量爆表,结果还是错的,还在上面推销自己的书,简直醉了。

本文转载改编自https://blog.csdn.net/flyyufenfei/article/details/72235748

海明码(也叫汉明码)具有一位纠错能力。本文以1010110这个二进制数为例解释海明码(偶校验)的编码和校验方法。

  编码

  确定校验码的位数x

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

2x-1 ≥ n+x   

  使不等式成立的x的最小值就是校验码的位数。在本例中,n=7,解得x=4。

       第i个检验位是第2i-1位,从该位开始,检验2i-1位,跳过2i-1

  确定校验码的位置

  校验码在二进制串中的位置为2的整数幂。剩下的位置为数据。如图所示。

位置1234567891011
内容x1x21x3010x4110

 

  求出校验位的值

  以求x2的值为例。为了直观,将表格中的位置用二进制表示。

位置00010010001101000101011001111000100110101011
内容x1x21x3010x4110

  为了求出x2,要使所有位置的第二位是1的数据(即形如**1*的位置的数据)的异或值为0。即x2^1^1^0^1^0 = 0。因此x2 = 1。

  同理可得x1 = 0, x3 = 1, x4 = 0。

位置00010010001101000101011001111000100110101011
内容01110100110

 

  因此1010110的海明码为01110100110。

  校验

  假设位置为1011的数据由0变成了1,校验过程为:

  将所有位置形如***1, **1*, *1**, 1***的数据分别异或。

  ***1: 0^1^0^0^1^1 = 1

  **1*: 1^1^1^0^1^1 = 1

  *1**: 1^0^1^0 = 0 

  1***: 0^1^1^1 = 1

  以上四组中,如果一组异或值为1,说明该组中有数据出错了。***1 **1* 1***的异或都为1,说明出错数据的位置为1011。


这种方法结束。还有一种只是说法不太一样,也贴上吧。转载自:http://www.yuyanping.com/the-basic-of-hamming-code/

海明码简单分析

确定校验位个数

海明码的码组长度需要符合:2^r – 1 (r代表校验位个数)

为什么是这个公式呢?因为:只有这样才能保证校验位足够覆盖整个需要校验的码组。

比如说:校验位有3位,那就是2^3 = 8 – 1 = 7 这样就可以校验长度为7的码组,如果按实际来说,也就是信息位 4 位,校验码 3 位。

通过上面分析,我们知道校验位 r 加上信息位 k 就等于 2^r – 1 , 这也就是为什么书上有 k + r <= 2^r – 1 的原因,下面是一些 R 和 K的关系表

信息码位数12~45~1112~2627~5758~120
校验码位数234567

注:表中数据取自网络

确定校验位的位置

知道了需要多少位校验码,还需要知道把校验码放在哪个位置上才行,这个只要记住,信息位在非2n的位置上,而校验位是在2n的位置上就可以了,条件再严格点就是,书上说的信息位所在海明码中的下标是需要等于前面几个校验组的下标,看到这里不懂没有关系,下面进行简单的例题分析。

举个粟(例)子:

信息字码组 : 1101 , 这时候信息位 k = 4 , 根据 k + r <= 2^r – 1 ,得出 r = 3 , 那就按书上说的,用P1、P2、P3来表示这3位校验码,这时候我们就来做填字格游戏。

P1 P2 1 P3 1 0 1

位置就这么简单的确定下来了,如果位数更多的话也是一样的,校验位就是在 1、2、4、8、16…….这些位置上。

计算校验位 Pi

上面已经知道要在什么位置插入校验码,现在就差下锅的料了,怎么求校验位实际的值呢?很简单!

根据海明码定义,是通过将信息进行分组,才得以实现检错和纠错的能力,就像一开始的图,每一个Pi都会包含3个信息位。

问题来了,那我怎么知道这些信息位是哪几个?还是书上的定义……

重点

比如说信息 1 1 0 1 ,从上面填字格游戏我们可以看出,被分别安排在 H3,H5,H6,H7的位置(这些位置怎么来的?7位数从1到7给每位编号嘛!)

则:H3 = H1+H2 (这里是等式右边下标相加等于等式左边下标的意思,下面一样)

H5 = H1+H4

H6 = H2 + H4

H7 = H1 + H2 + H4

通过上面的关系式,我们可以看出,右边在海明码中的数位,正好都是校验码的位置,下面来正式求校验码了。

P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示异或)

P2(H2) = H3 ⊕ H6 ⊕ H7

P3(H4) = H5 ⊕ H6 ⊕ H7

大功告成!啥?还要我算出来?打字很累的,手短打字又慢,行吧行吧,想在以前自己学海明码,怎么看都不会的份上,可能也是自己太笨…….

信息码:1101 对应海明位 H3、H5、H6、H7,不要把海明码,校验位,信息位搞混了哦!虽然我也是经常弄混哈哈!

P1 = 1 ⊕ 1 ⊕ 1 = 1;

P2 = 1 ⊕ 0 ⊕ 1 = 0;

P3 = 1 ⊕ 0 ⊕ 1 = 0;

啥?异或不懂?没关系,我也经常不懂,相同 = 0 ,不同 = 1,异表示不同,按或的规则,是不是好奇葩!

好了,现在我们可以完成填字游戏了 P1 P2 1 P3 1 0 1 ==> 1010101,这就是我们最后需要得到的海明码,终于完成了!

还没完呢……有了这个海明码还需要知道怎么校验有没有出错啊,简单简单,跟我继续来学习!

海明码纠错和检错

有了上面的校验码和信息码,我们就能借用他们去知道怎么检查,信息在传送的过程中有没有发生错误,废话不多说,下面开始,还是书上的定义,因为校验码有三位,我们这里再申明三位码分别用S1、S2、S3表示,满足下列关系:

S1 = P1 ⊕ H3 ⊕ H5 ⊕ H7 ;

S2 = P2 ⊕ H3 ⊕ H6 ⊕ H7;

S3 = P3 ⊕ H5 ⊕ H6 ⊕ H7;

这样求出来的S1、S2、S3如果都为0就是没有出错,如果不是0就表示在海明码中出错的位置,将其取反就可以起到纠错的功能了。很简单吧,等等,为什么是上面的关系式?哪来的?可以往上看看求校验码那里,这就是分组的结果,这里我就偷懒下不算了,你们可以自己算算,真的结束了……


查看评论

全国IP地址分配表(一)

全国IP地址分配表(一)关键词:NT, 计算机安全, 其他全国IP地址分配表(一)     xa.sn.cn,西安公众网,西安,陕西,CN,202.100.0.*   xa.sn.cn,西安公众网,西...
  • ghj1976
  • ghj1976
  • 2001-02-27 11:10:00
  • 1664

海明码教程解析示例……

  • 2008年12月23日 12:18
  • 3KB
  • 下载

(看得懂的)海明码的编码和校验方法

转载自:http://www.cnblogs.com/scrutable/p/6052127.html 看了半天就这个看懂了。所以转载了。 海明码(也叫汉明码)具有一位纠错...
  • flyyufenfei
  • flyyufenfei
  • 2017-05-16 09:37:22
  • 7340

海明码的生成

海明校验码具有检测错误的能力,同时还具有找出错误所在位置的能力。海明码的编码原理:给出信息,组成信息位:,其余位置填充位置码,海明码由此组成。 给定信息. 构建海明码: 其中,pi的值由和bi...
  • theArcticOcean
  • theArcticOcean
  • 2016-02-10 14:52:50
  • 941

海明码的生成与解码

  • 2012年10月10日 08:34
  • 2KB
  • 下载

软考学习--海明码

求信息1011的海明码.     求解步骤:     (1)用k表示信息位数,r为校验位数.根据信息位数求出校验位数,公式是2^r≥k+r+1,满足这个不等式的最小的r,就是校验位数.     ...
  • liuyanlinglanq
  • liuyanlinglanq
  • 2013-09-21 16:09:49
  • 1278

海明码编码示例

在写编码步骤之前,先来熟悉几个表示符号:          编码规则                  下面以8为数据位编码步骤为例:    一,确定D与P在海明码中的位置 ...
  • lhc2207221755
  • lhc2207221755
  • 2014-09-27 22:28:53
  • 1996

【软考】——海明码和CRC码

软考的过程遇到海明码和CRC的码,觉得不是很了解,查了一下资料,整理下。也是帮助自己理解,同样希望可以大家理解海明码和CRC校正码。 海明码     核心公式:2r ≥k+r+1 其中k为信息...
  • jiadajing267
  • jiadajing267
  • 2016-10-27 20:47:53
  • 1062

海明码详解(如何计算海明码)

  • 2011年05月04日 18:18
  • 96KB
  • 下载

c语言实现的海明码算法

  • 2009年12月12日 12:41
  • 6KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 405
    排名: 12万+
    文章存档
    最新评论