此文为转载

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

本书原始目录参见此文:http://blog.csdn.NET/lycb_gz/article/details/8199839

5.3.6 海明纠错码

海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码,所以它也仅用于信道特性比较好的环境中,如以太局域网中,因为如果信道特性不好的情况下,出现的错误通常不是一位。

海明码的检错、纠错基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。

要采用海明码纠错,需要按以下步骤来进行:计算校验位数→确定校验码位置→确定校验码→实现校验和纠错。下面来具体介绍这几个步骤。本文先介绍除最后一个步骤的其它几个步骤。

1.    计算校验位数

要使用海明码纠错,首先就要确定发送的数据所需要要的校验码(也就是“海明码”)位数(也称“校验码长度”)。它是这样的规定的:假设用N表示添加了校验码位后整个信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位,它们之间的关系应满足:N=K+r≤2r-1。

如K=5,则要求2r-r≥5+1=6,根据计算可以得知r的最小值为4,也就是要校验5位信息码,则要插入4位校验码。如果信息码是8位,则要求2r-r≥8+1=9,根据计算可以得知r的最小值也为4。根据经验总结,得出信息码和校验码位数之间的关系如表5-1所示。

表5-1   信息码位数与校验码位数之间的关系

信息码位数

1

2~4

5~11

12~26

27~57

58~120

121~247

校验码位数

2

3

4

5

6

7

8

2.确定校验码位置

上一步我们确定了对应信息中要插入的校验码位数,但这还不够,因为这些校验码不是直接附加在信息码的前面、后面或中间的,而是分开插入到不同的位置。但不用担心,校验码的位置很容易确定的,那就是校验码必须是在2n次方位置,如第1、2、4、8、16、32,……位(对应20、21、22、23、24、25,……,是从最左边的位数起的),这样一来就知道了信息码的分布位置,也就是非2n次方位置,如第3、5、6、7、9、10、11、12、13,……位(是从最左边的位数起的)。

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

现假设原来的8位信息码为10011101,因现在还没有求出各位校验码值,现在这些校验码位都用“?”表示,最终的码字为:??10011101

3.    确定校验码

经过前面的两步,我们已经确定了所需的校验码位数和这些校验码的插入位置,但这还不够,还得确定各个校验码值。这些校验码的值不是随意的,每个校验位的值代表了代码字中部分数据位的奇偶性(最终要根据是采用奇校验,还是偶校验来确定),其所在位置决定了要校验的比特位序列。总的原则是:第i位校验码从当前位开始,每次连续校验i(这里是数值i,不是第i位,下同)位后再跳过i位,然后再连续校验i位,再跳过i位,以此类推。最后根据所采用的是奇校验,还是偶校验即可得出第i位校验码的值。

1)计算方法

校验码的具体计算方法如下:

p1(第1个校验位,也是整个码字的第1位)的校验规则是:从当前位数起,校验1位,然后跳过1位,再校验1位,再跳过1位,……。这样就可得出p1校验码位可以校验的码字位包括:第1位(也就是p1本身)、第3位、第5位、第7位、第9位、第11位、第13位、第15位,……。然后根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p2(第2个校验位,也是整个码字的第2位)的校验规则是:从当前位数起,连续校验2位,然后跳过2位,再连续校验2位,再跳过2位,……。这样就可得出p2校验码位可以校验的码字位包括:第2位(也就是p2本身)、第3位,第6位、第7位,第10位、第11位,第14位、第15位,……。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p3(第3个校验位,也是整个码字的第4位)的校验规则是:从当前位数起,连续校验4位,然后跳过4位,再连续校验4位,再跳过4位,……。这样就可得出p4校验码位可以校验的码字位包括:第4位(也就是p4本身)、第5位、第6位、第7位,第12位、第13位、第14位、第15位,第20位、第21位、第22位、第23位,……。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

p4(第4个校验位,也是整个码字的第8位)的校验规则是:从当前位数起,连续校验8位,然后跳过8位,再连续校验8位,再跳过8位,……。这样就可得出p4校验码位可以校验的码字位包括:第8位(也就是p4本身)、第9位、第10位、第11位、第12位、第13位、第14位、第15位,第24位、第25位、第26位、第27位、第28位、第29位、第30位、第31位,……。同样根据所采用的是奇校验,还是偶校验,最终可以确定该校验位的值。

……

我们把以上这些校验码所校验的位分成对应的组,它们在接收端的校验结果(通过对各校验位进行逻辑“异或运算”得出)对应表示为G1、G2、G3、G4,……,正常情况下均为0。

2)校验码计算示例

同样举上面的例子来说明,码字为??10011101

先求第1个“?”(也就是p1,第1位)的值,因为整个码字长度为12(包括信息码长和校验码长),所以可以得出本示例中p1校验码校验的位数是1、3、5、7、9、11共6位。这6位中除了第1位(也就是p1位)不能确定外,其余5位的值都是已知的,分别为:1、0、1、1、0。现假设采用的是偶校验(也就是要求整个被校验的位中的“1”的个数为偶数),从已知的5位码值可知,已有3个“1”,所以此时p1位校验码的值必须为“1”,得出p1=1。

再求第2个“?”(也就是p2,第2位)的值,根据以上规则可以很快得出本示例中p2校验码校验的位数是2、3、6、7、10、11,也是一共6位。这6位中除了第2位(也就是p2位)不能确定外,其余5位的值都是已知的,分别为:1、0、1、1、0。现假设采用的是偶校验,从已知的5位码值可知,也已有3个“1”,所以此时p2位校验码的值必须为“1”,得出p2=1。

再求第3个“?”(也就是p3,第4位)的值,根据以上规则可以很快得出本示例中p3校验码校验的位数是4、5、6、7、12,一共5位。这5位中除了第4位(也就是p3位)不能确定外,其余4位的值都是已知的,分别为:0、0、1、1。现假设采用的是偶校验,从已知的4位码值可知,也已有2个“1”,所以此时p2位校验码的值必须为“0”,得出p3=0。

最后求第4个“?”(也就是p4,第8位)的值,根据以上规则可以很快得出本示例中p4校验码校验的位数是8、9、10、11、12(本来是可以连续校验8位的,但本示例的码字后面的长度没有这么多位,所以只校验到第12位止),也是一共5位。这5位中除了第8位(也就是p4位)不能确定外,其余4位的值都是已知的,分别为:1、1、0、1。现假设采用的是偶校验,从已知的4位码值可知,已有3个“1”,所以此时p2位校验码的值必须为“1”,得出p4=1。

最后就可以得出整个码字的各个二进制值码字为:111000111101(带阴影的4位就是校验码)。

你看得懂的海明码校验和纠错原理相关推荐

  1. 你看得懂的海明码校验和纠错原理(一)

    以下内容摘自笔者最新出版的著作<深入理解计算机网络>一书:http://item.jd.com/11165825.html 本书原始目录参见此文:http://blog.csdn.net/ ...

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

    转载自:http://www.cnblogs.com/scrutable/p/6052127.html 看了半天就这个看懂了.所以转载了. 海明码(也叫汉明码)具有一位纠错能力.本文以1010110这 ...

  3. 动态磅是怎么原理_一看就懂的十种泵的工作原理动态图

    1.水环式真空泵动态原理图: 当水环式真空泵叶轮按图中顺时针方向旋转时,水被叶轮抛向四周,由于离心力的作用,水形成了一个决定于泵腔形状的近似于等厚度的封闭圆环. 水环的下部分内表面恰好与叶轮轮毂相切, ...

  4. c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...

  5. 前端app调起摄像头 只显示在页面_猫也能看得懂的教程之一分钟使用Vue搭建简单Web页面...

    本教程适合人群: 已经了解过过html.js.css,想深入学习前端技术的小伙伴 有前端开发经验.但是没有使用过Vue的小伙伴 有过其他编程经验,对前端开发感兴趣的小伙伴 学习本教程之后你将会: 了解 ...

  6. python爬虫简单实例-最简单的Python爬虫案例,看得懂说明你已入门,附赠教程

    原标题:最简单的Python爬虫案例,看得懂说明你已入门,附赠教程 这是最简单的Python爬虫案例,如果你能看懂,那么请你保持信心,因为你已经入门Python爬虫,只要带着信心和努力,你的技术能力在 ...

  7. python程序员搞笑段子_程序员才能看得懂的段子,内含表情包,吃饭的时候别点!...

    原标题:程序员才能看得懂的段子,内含表情包,吃饭的时候别点! 很多网友都认为程序员必定是非常古板,整天只会敲键盘的码农.其实这种看法是非常片面的.真正优秀的程序员,不仅精通程序的编写,还是某些领域的专 ...

  8. 【机器学习】小孩都看得懂的 GAN

    全文共 6327 字,55 幅图, 预计阅读时间 32 分钟. 本文是「小孩都看得懂」系列的第十八篇,本系列的特点是内容不长,碎片时间完全可以看完,但我背后付出的心血却不少.喜欢就好! 小孩都看得懂的 ...

  9. 史密斯圆图串并联口诀_看得懂的史密斯圆图(个人总结)

    看得懂的史密斯圆图(个人总结) 2018-09-11 史密斯圆图(Smith chart)是一款用于电机与电子工程学的圆图,主要用于传输线的阻抗匹配上.一条传输线(transmission line) ...

最新文章

  1. JavaScript实现冒泡排序
  2. 【Java Web开发指南】ELJSTL笔记
  3. 网络营销专员表示网络营销中设置不当会影响蜘蛛爬虫对网站抓取
  4. python小游戏源码-导弹发射小游戏——Python源代码
  5. yum lock 解决方法
  6. 第一章:递推与递归 【完结】
  7. foxmail 服务器备份 立刻删除_PC整机备份与还原教程 Active Backup for Business
  8. [leetcode]102.二叉树的层序遍历
  9. c语言汇编混合编程方法,C语言和汇编语言混合编程方法
  10. python爬虫源码项目_32个Python爬虫实战项目,满足你的项目慌(带源码)
  11. 判斷作業系統為 64bit 或 32bit z
  12. SAP系统管理员的工作
  13. scala.Enumeration 枚举示例
  14. 微信朋友圈功能测试用例
  15. js常用的加密/解密方法
  16. NLP入门学习(一):搜狗新闻语料库的获取与预处理
  17. [JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏
  18. (据说是)鏼爷和吴凯路爷爷出的NOIP模拟神题集锦
  19. python爬取B站动态的评论总数(不含用户评论内容详情)
  20. 推荐系统(十一) 2021-2022年工业界推荐算法实践经验汇总

热门文章

  1. 计算连续登陆最大天数
  2. java递归方法分析
  3. C# 理解Thread.Sleep()方法 ----转帖
  4. VMware 安装LINUX系统(一)
  5. python学习Day7 数据类型的转换,字符编码演变历程
  6. 2019 Power BI最Top50面试题,助你面试脱颖而出系列中
  7. 「BZOJ2190」[SDOI2008] 仪仗队 - 欧拉函数
  8. 洛谷 P4503 [CTSC2014]企鹅QQ 解题报告
  9. Python 学习第十七天 jQuery
  10. 【转载】Java 性能优化之String