你看得懂的海明码校验和纠错原理

茶乡浪子 茶乡浪子     2023-01-23     678

关键词:

      以下内容摘自笔者最新出版的著作《深入理解计算机网络》一书: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=Kr≤2r1

      如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位就是校验码)。

             <未完待续>


promise之你看得懂的promise(代码片段)

本文由作者陈旭锋(任职网易考拉)授权网易云社区发布。Promise源码详解学习知识要善于思考,思考,再思考。——爱因斯坦1.回调地狱曾几何时,我们的代码是这样的,为了拿到回调的结果,不得不callbackhell,这种环环相扣的... 查看详情

海明码/汉明码的计算和纠错

海明校验码:   详解:当我们确定校验位在海明码中的位置后,我们需要做去确定哪几个位置的信息位进行异或来得到相应校验位p1、p2、p3的值,根据图3我们将所有信息位的下标换算成二进制后,确定这些... 查看详情

纠错编码-海明码(代码片段)

一.海明码海明码只能发现双比特错误,纠正单比特错误二.工作原理“动一发而牵全身”,因为海明码是一个多重校验码,也就是码字中的信息码位同时被多个校验码进行校验三.工作流程1.确定校验码位数海明不等式2^r>=k+r+1,r... 查看详情

海明校验码(靠谱的解释)

...https://www.cnblogs.com/zsswpb/p/5771636.html【定义】   海明码(HammingCode)是利用奇偶性来检错和纠错的校验方法。海明码的构成方法是在数据位之间的确定位置插入k个校验位,通过扩大吗距来实现检错和纠错。对于数据位m... 查看详情

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

转载自:http://blog.csdn.net/flyyufenfei/article/details/72235748海明码(也叫汉明码)具有一位纠错能力。本文以1010110这个二进制数为例解释海明码的编码和校验方法。  编码  确定校验码的位数x  设数据有n位,校验码有x位。则... 查看详情

海明校验码

一、概述  由RichardHamming于1950年提出、目前还被广泛采用的一种很有效的校验方法,是只要增加少数几个校验位,就能检测出二位同时出错、亦能检测出一位出错并能自动恢复该出错位的正确值的有效手段,后者被称为自动纠... 查看详情

(计算机组成原理)第二章数据的表示和运算-第一节4:校验码

...二:常见校验码(1)奇偶校验码(2)海明校验码A:纠错理论B:求解海明码C:补充-全校验位(3)循环冗余校验码(CRC码& 查看详情

海明码(容易看懂)

转载自:http://www.cnblogs.com/scrutable/p/6052127.html海明码(也叫汉明码)具有一位纠错能力。本文以1010110这个二进制数为例解释海明码的编码和校验方法。  编码  确定校验码的位数x  设数据有n位,校验码有x位。则校验码一... 查看详情

计算机网络-数据链路层差错控制(检错编码纠错编码)(代码片段)

...生成冗余码2.2接收端——检错2.3相关例题3纠错编码——海明码3.1确定海明码的位数3.2确定校验位的分布3.3对校验码进行分组3.4求出校验码的值(偶校验)3.5检错和纠错3.5.1纠错方法一3.5.2纠错方法二1检错编码——奇 查看详情

数据链路层-第三节:差错控制(代码片段)

...f09;循环冗余检验码(CRC)二:纠错编码(海明校验码)(1)码字和码距(2)海明校验码A:纠错理论B:求解海明码C:补充-全校验位三:注意本节对应视频如下【计算机网络微课... 查看详情

数据链路层-第三节:差错控制(代码片段)

...f09;循环冗余检验码(CRC)二:纠错编码(海明校验码)(1)码字和码距(2)海明校验码A:纠错理论B:求解海明码C:补充-全校验位三:注意本节对应视频如下【计算机网络微课... 查看详情

hdu1024maxsumplusplus小白都可以看得懂的解析

...上的很多都看不懂,所以想要写一个像我这种菜鸟都可以看得懂的解析。题意是将一个长度为n的序列,分成m段不相交叉的子段,使得他们的和最大。于是可以用dp[i][j]来表示在前j个数中,以num[j]结尾并分为i段的最大和。此时我... 查看详情

计算机网络-数据链路层差错控制(检错编码纠错编码)(代码片段)

...生成冗余码2.2接收端——检错2.3相关例题3纠错编码——海明码3.1确定海明码的位数3.2确定校验位的分布3.3对校验码进行分组3.4求出校验码的值(偶校验)3.5检错和纠错3.5.1纠错方法一3.5.2纠错方法二1检错编码——奇偶校... 查看详情

莽村李青都看得懂的vue响应式原理(代码片段)

Vue响应式原理八股文序违背老祖宗的决定将Vue响应式原理公众于世响应式数据(Observe篇)dom更新(Wacther篇)依赖收集八股文序开篇来一段大家都会背诵的八股文。某面试官:请你简要介绍一下Vue的响应式原理... 查看详情

人人都看得懂的正则表达式教程

编写验证规则最流行和最简单的方法就是正则表达式了,但唯一的一个问题是正则表达式的语法太隐晦了,让人蛋疼无比。很多开发者为了在项目中应用复杂的验证,经常要使用一些小抄来记住正则式的复杂语法和各种常用命令... 查看详情

奇偶效验码和海明码

奇偶效验码奇偶校验码是奇校验码和偶校验码的统称。它们都是通过在要校验的编码上加一位校验位组成。奇校验码:加上校验位后,编码中 1 的个数为奇数个。偶校验码:加上校验位后,编码中 1 的个数为偶数个... 查看详情

小白都看得懂的布局加载流程(代码片段)

本篇文章的起点是从Activity的setContentView方法说起。我先放一张加载布局的时序图,布局加载涉及的类相对比较少一些。1.Activity#setContentView()publicvoidsetContentView(@LayoutResintlayoutResID)getWindow().setContentView(layoutResID);init 查看详情

计算机系统知识—海明码

海明码校验  当计算机存储或移动数据时,可能会产生数据位错误。这时能够利用汉明码来检測并纠错,简单的说,汉明码是一个错误校验码码集。  了解海明码之前先了解一下异或:  异或的数学符号为“... 查看详情