海明码(Hamming Code)是一个能够有多个校验位,具备检测并纠正一位错误代码的纠错码,因此它也仅用于信道特性比较好的环境中,如以太局域网中,由于若是信道特性很差的状况下,出现的错误一般不是一位。测试
海明码的检错、纠错基本思想是将有效信息按某种规律分红若干组,每组安排一个校验位进行奇偶性测试,而后产生多位检测信息,并从中得出具体的出错位置,最后经过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。编码
要采用海明码纠错,须要按如下步骤来进行:计算校验位数→肯定校验码位置→肯定校验码→实现校验和纠错。下面来具体介绍这几个步骤。本文先介绍除最后一个步骤的其它几个步骤。spa
要使用海明码纠错,首先就要肯定发送的数据所须要要的校验码(也就是“海明码”)位数(也称“校验码长度”)。它是这样的规定的:假设用N表示添加了校验码位后整个信息的二进制位数,用K表明其中有效信息位数,r表示添加的校验码位,它们之间的关系应知足:N=K+r≤2r-1。blog
如K=5,则要求2r-r≥5+1=6,根据计算能够得知r的最小值为4,也就是要校验5位信息码,则要插入4位校验码。若是信息码是8位,则要求2r-r≥8+1=9,根据计算能够得知r的最小值也为4。根据经验总结,得出信息码和校验码位数之间的关系如表5-1所示。ci
表5-1 信息码位数与校验码位数之间的关系get
信息码位数io |
1table |
2~4二进制 |
5~11方法 |
12~26 |
27~57 |
58~120 |
121~247 |
校验码位数 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
上一步咱们肯定了对应信息中要插入的校验码位数,但这还不够,由于这些校验码不是直接附加在信息码的前面、后面或中间的,而是分开插入到不一样的位置。但不用担忧,校验码的位置很容易肯定的,那就是校验码必须是在2n次方位置,如第一、二、四、八、1六、32,……位(对应20、21、22、23、24、25,……,是从最左边的位数起的),这样一来就知道了信息码的分布位置,也就是非2n次方位置,如第三、五、六、七、九、十、十一、十二、13,……位(是从最左边的位数起的)。
举一个例子,假设现有一个8位信息码,即b一、b二、b三、b四、b五、b六、b七、b8,由表5-1得知,它须要插入4位校验码,即p一、p二、p三、p4,也就是整个通过编码后的数据码(称之为“码字”)共有12位。根据以上介绍的校验码位置分布规则能够得出,这12位编码后的数据就是p一、p二、b一、p三、b二、b三、b四、p四、b五、b六、b七、b8。
现假设原来的8位信息码为10011101,因如今尚未求出各位校验码值,如今这些校验码位都用“?”表示,最终的码字为:??1?001?1101。
通过前面的两步,咱们已经肯定了所需的校验码位数和这些校验码的插入位置,但这还不够,还得肯定各个校验码值。这些校验码的值不是随意的,每一个校验位的值表明了代码字中部分数据位的奇偶性(最终要根据是采用奇校验,仍是偶校验来肯定),其所在位置决定了要校验的比特位序列。总的原则是:第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位,……。一样根据所采用的是奇校验,仍是偶校验,最终能够肯定该校验位的值。
……
咱们把以上这些校验码所校验的位分红对应的组,它们在接收端的校验结果(经过对各校验位进行逻辑“异或运算”得出)对应表示为G一、G二、G三、G4,……,正常状况下均为0。
2)校验码计算示例
一样举上面的例子来讲明,码字为??1?001?1101。
先求第1个“?”(也就是p1,第1位)的值,由于整个码字长度为12(包括信息码长和校验码长),因此能够得出本示例中p1校验码校验的位数是一、三、五、七、九、11共6位。这6位中除了第1位(也就是p1位)不能肯定外,其他5位的值都是已知的,分别为:一、0、一、一、0。现假设采用的是偶校验(也就是要求整个被校验的位中的“1”的个数为偶数),从已知的5位码值可知,已有3个“1”,因此此时p1位校验码的值必须为“1”,得出p1=1。
再求第2个“?”(也就是p2,第2位)的值,根据以上规则能够很快得出本示例中p2校验码校验的位数是二、三、六、七、十、11,也是一共6位。这6位中除了第2位(也就是p2位)不能肯定外,其他5位的值都是已知的,分别为:一、0、一、一、0。现假设采用的是偶校验,从已知的5位码值可知,也已有3个“1”,因此此时p2位校验码的值必须为“1”,得出p2=1。
再求第3个“?”(也就是p3,第4位)的值,根据以上规则能够很快得出本示例中p3校验码校验的位数是四、五、六、七、12,一共5位。这5位中除了第4位(也就是p3位)不能肯定外,其他4位的值都是已知的,分别为:0、0、一、1。现假设采用的是偶校验,从已知的4位码值可知,也已有2个“1”,因此此时p2位校验码的值必须为“0”,得出p3=0。
最后求第4个“?”(也就是p4,第8位)的值,根据以上规则能够很快得出本示例中p4校验码校验的位数是八、九、十、十一、12(原本是能够连续校验8位的,但本示例的码字后面的长度没有这么多位,因此只校验到第12位止),也是一共5位。这5位中除了第8位(也就是p4位)不能肯定外,其他4位的值都是已知的,分别为:一、一、0、1。现假设采用的是偶校验,从已知的4位码值可知,已有3个“1”,因此此时p2位校验码的值必须为“1”,得出p4=1。
最后就能够得出整个码字的各个二进制值码字为:111000111101(带阴影的4位就是校验码)。