1.确定校验码的位数r
2.确定校验码的位置
3.确定数据的位置
4.求出校验码的值
假设要推到D=101101这串二进制数的海明码,应按照以下步骤。
1.确定校验码的位数r。
数据的位数k=6,按照公式来计算满足条件r的最小值,如下:
2r-1≥k+r
2r≥7+r
解此不等式,满足不等式的最小r为4,也就是D=101101的海明码应该有6+4=10位,其中原数据6位,效验码4位。
2.确定校验码的位置。
不妨假设这4位效验码分别为P1、P2、P3、P4;数据从左到右为D1、D2、……、D6.编码后的数据共有6+4=10位,设为M1、M2、……、M10.
校验码Pi(i取1,2,3,4)在编码中的位置为2i-1,见表3-1.
表3-1 校验码Pi在编码中的位置
M1 | M2 | M3 | M4 | M5 | M6 | M7 | M8 | M9 | M10 | |
甲 | P1 | P2 | P3 | P4 |
3.确定数据的位置。
除了效验码的位置,其余的就是数据的位置,填充进去即可,于是可以把数据信息先填进去,见表3-2的“乙”行。
表3-2 数据在编码中的位置
M1 | M2 | M3 | M4 | M5 | M6 | M7 | M8 | M9 | M10 | |
甲 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
乙 | 1 | 0 | 1 | 1 | 0 | 1 |
4.求出校验码的值。(精华)
这个公式有规律可循,但基本没有任何教材讲过,无意在一篇论文中看到。
假设出错位为e1、e2、e3、e4,现在需要做的就是将M1、M2、……、M10和e1、e2、e3、e4的关系对应出来,只要这个关系出来了,所有问题就都解决了。演示几个。
M1下标中的1可以表示成0001,这里的0001分别对应e4、e3、e2、e1(倒过来看),由于e1的值为1,因此M1只和e1有关;M3下标中的3可以表示成0011,因此M3和e1
、e2有关;M7下标中的7可以表示成0111,因此M7和e1、e2、e3有关。其他以此类推,只需将这些有关的用异或符号“⊕”连接起来即可,最后可得以下公式:
e1=M1⊕M3⊕M5⊕M7⊕M9
e2=M2⊕M3⊕M6⊕M7⊕M9
e3=M4⊕M5⊕M6⊕M7
e4=M8⊕M9⊕M10
然后将表3-1中求出的数据对应过来,即
e1=P1⊕D1⊕D2⊕D4⊕D5
e2=P2⊕D1⊕D3⊕D4⊕D6
e3=P3⊕D2⊕D3⊕D4
e4=P4⊕D5⊕D6
如果海明码没有错误信息,e1、e2、e3、e4都为0,等式右边的值也得为0,由于是异或,因此Pi(i取1,2,3,4)的值跟后边的式子必须一样才能使整个式子的值为0,即
P1=D1⊕D2⊕D4⊕D5
P2=D1⊕D3⊕D4⊕D6
p3=D2⊕D3⊕D4
P4=D5⊕D6
下面只需要将值代入计算即可:
P1=D1⊕D2⊕D4⊕D5=1⊕0⊕1⊕0=0
P2=D1⊕D3⊕D4⊕D6=1⊕1⊕1⊕1=0
p3=D2⊕D3⊕D4=0⊕1⊕1=0
P4=D5⊕D6=0⊕1=1
接下来把Pi的值填写到表3-1中,见表3-3的“丙”行,就可以得到海明码。
表3-3 “丙”行中的数据
M1 | M2 | M3 | M4 | M5 | M6 | M7 | M8 | M9 | M10 | |
甲 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
丙 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
故101101的海明码为0010011101.
但是知道了怎么编写海明码,还需要知道怎么校验,方法如下。
现在假设第5位出错了,也就是第5位在传输的过程中被改为“1”,即得到的数据为0010111101.现在要找出错误的位置(假设现在不知道出错的位置)。
继续使用:
e1=M1⊕M3⊕M5⊕M7⊕M9=0⊕1⊕1⊕1⊕0=1
e2=M2⊕M3⊕M6⊕M7⊕M9=0⊕1⊕1⊕1⊕1=0
e3=M4⊕M5⊕M6⊕M7=0⊕1⊕1⊕1=1
e4=M8⊕M9⊕M10=1⊕0⊕1=0
按照e4、e3、e2、e1的排序方式得到的二进制序列为0101,恰好对应十进制5,这样就找到了出错的位置,即出错位是第5位。