海明校验码(Hamming Code)
是由贝尔实验室的Richard Hamming设计的,是一种利用奇偶性来检错和纠错的检验方法。海明码的构成方法是在数据位之间的特定位置上插入k个校验位,通过扩大码距来实现检错和纠错。
实现原理:是在m个数据位之外加上k个校验位,从而形成一个m+k位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。
设数据位是n位,校验位是k位,则n和k必须满足以下关系:
根据上诉不等式,可计算出
n值 | 最小k值 |
1 | 2 |
2~4 | 3 |
5~11 | 4 |
12~26 | 5 |
27~57 | 6 |
58~120 | 7 |
例如:原始信息——101101100 9位
则
推出 k=4
因为海明校验码是放在2的次幂位上的,所有插在位置1,2,4,8中
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
原始信息位 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
位置 | 用到的校验码 | 海明码下标 |
1 | 校验位 | |
2 | 校验位 | |
3 | 1,2 | 1+2=3 |
4 | 校验位 | |
5 | 1,4 | 1+4=5 |
6 | 2,4 | 2+4=6 |
7 | 1,2,4 | 1+2+4=7 |
8 | 校验码 | |
9 | 1,8 | 1+8=9 |
10 | 2,8 | 2+8=10 |
11 | 1,2,8 | 1+2+8=11 |
12 | 4,8 | 4+8=12 |
13 | 1,4,8 | 1+4+8=13 |
用到的校验码是看 当前位置由哪几个 校验码所在的位置的和
- 例如
校验码的位置是1,2,4,8。位置3= 1 + 2,所以位置3用到的校验码是1和2;位置7 = 1 + 2 + 4组成的,所以位置7用到的校验码是1,2和4。
然后将校验码校验的位置记录下来:
- 校验码1(位置1):3,5,7,9,11,13
- 校验码2(位置2):3,6,7,10,11
- 校验码3(位置4):5,6,7,12,13
- 校验码4(位置8):9,10,11,12,13
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 |
注意:后面的数字串是位置的下标,不是值,值还是0或1。
然后做异或运算(相同时为0,不同时为1)
- 校验码1(位置1):1⊕0⊕1⊕0⊕1⊕0 = 1
- 校验码2(位置2):1⊕1⊕1⊕1⊕1 = 1
- 校验码3(位置4):0⊕1⊕1⊕0⊕0 = 0
- 校验码4(位置8):0⊕1⊕1⊕0⊕0 = 0
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
原始信息位 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
真是研究了好久,才知道是啥,果然是难者不会会者不难。