海明码基本思想是分组偶校验,由信息位(n)和校验位(k)组成,海明码的校验位计算公式:2^k >= n+k+1
2^k表示:k个校验位对应2^k种状态n + k + 1表示:n + k代表任何一位都可能出错,1代表一种正确的状态
原理
假设数据为 D8~D1 = 10101011,求海明码?
首先算出校验位,代入公式 2^k >= n + k + 1
n = 8->k = 4
校验位算出是 4 位,记为:P1~P4
海明码位数由信息位和校验位组成:8 + 4 = 12,记为 H1~H12
校验位所在的位置是 2^(k-1),P1~P4 对应 H1、H2、H4、H8,信息位填入剩下的空位:
| H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| D8 | D7 | D6 | D5 | P4 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
| 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
D1~D8 已经填入相应的位置,现在需要计算剩余的 P1~P4 的值。
求校验位需要先知道信息位所在位置的二进制(k 位,对应校验位)
- 信息位所在位置:
H3/H5/H6/H7/H9/H10/H11/H12 - 信息位的最后一位为
P1,最后第二位为P2,以此类推P4 P3 P2 P1 H3 0 0 1 1 H5 0 1 0 1 H6 0 1 1 0 H7 0 1 1 1 H9 1 0 0 1 H10 1 0 1 0 H11 1 0 1 1 H12 1 1 0 0
校验位对应各信息位二进制数为 1 的组合:
P1对应的信息位H3/H5/H7/H9/H11P2对应的信息位H3/H6/H7/H10/H11P3对应的信息位H5/H6/H7/H12P4对应的信息位H9/H10/H11/H12
将各信息位的值进行异或运算,求得校验位的值:
P1->H3/H5/H7/H9/H11->D1⊕D2⊕D4⊕D5⊕D7->1⊕1⊕1⊕0⊕0->1P2->H3/H6/H7/H10/H11->D1⊕D3⊕D4⊕D6⊕D7->1⊕0⊕1⊕1⊕0->1P3->H5/H6/H7/H12->D2⊕D3⊕D4⊕D8->1⊕0⊕1⊕1->1P4->H9/H10/H11/H12->D5⊕D6⊕D7⊕D8->0⊕1⊕0⊕1->0
P1P2P3P4 -> 1110 填入:
| H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| D8 | D7 | D6 | D5 | P4 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
| 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
最终得到的海明码为:101001011111
纠错
海明码纠错的方式是:各校验位用偶校验进行校验
通过上面得到校验方程是:
S1:P1⊕D1⊕D2⊕D4⊕D5⊕D7->1⊕1⊕1⊕1⊕0⊕0->0S2:P2⊕D1⊕D3⊕D4⊕D6⊕D7->1⊕1⊕0⊕1⊕1⊕0->0S3:P3⊕D2⊕D3⊕D4⊕D8->1⊕1⊕0⊕1⊕1->0S4:P4⊕D5⊕D6⊕D7⊕D8->0⊕0⊕1⊕0⊕1->0
一位出错
例1:
| H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| D8 | D7 | D6 | D5 | P4 | D4 | D3 | D2 | P3 | D1 | P2 | P1 | |
| 正确 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| H2出错 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 |
代入校验方程:
S1:P1⊕D1⊕D2⊕D4⊕D5⊕D7->1⊕1⊕1⊕1⊕0⊕0->0S2:P2⊕D1⊕D3⊕D4⊕D6⊕D7->0⊕1⊕0⊕1⊕1⊕0->1S3:P3⊕D2⊕D3⊕D4⊕D8->1⊕1⊕0⊕1⊕1->0S4:P4⊕D5⊕D6⊕D7⊕D8->0⊕0⊕1⊕0⊕1->0
得到错误位S4S3S2S1:0010,转为十进制为 2,也就是说 H2 处错了。
例2:
| H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| D8 | D7 | D6 | D5 | P4 | D4 | D3 | D2 | P3 | D1 | P2 | P1 | |
| 正确 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| H11出错 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
代入校验方程:
S1:P1⊕D1⊕D2⊕D4⊕D5⊕D7->1⊕1⊕1⊕1⊕0⊕1->1S2:P2⊕D1⊕D3⊕D4⊕D6⊕D7->1⊕1⊕0⊕1⊕1⊕1->1S3:P3⊕D2⊕D3⊕D4⊕D8->1⊕1⊕0⊕1⊕1->0S4:P4⊕D5⊕D6⊕D7⊕D8->0⊕0⊕1⊕1⊕1->1
得到错误位S4S3S2S1:1011,转为十进制为 11,也就是说 H11 处错了。
S4S3S2S1 指明了出错位在哪里
两位出错
例1:
| H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| D8 | D7 | D6 | D5 | P4 | D4 | D3 | D2 | P3 | D1 | P2 | P1 | |
| 正确 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| H2、H9出错 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 |
代入校验方程:
S1:P1⊕D1⊕D2⊕D4⊕D5⊕D7->0⊕1⊕1⊕1⊕1⊕1->1S2:P2⊕D1⊕D3⊕D4⊕D6⊕D7->1⊕1⊕0⊕1⊕1⊕1->1S3:P3⊕D2⊕D3⊕D4⊕D8->1⊕1⊕0⊕1⊕1->0S4:P4⊕D5⊕D6⊕D7⊕D8->1⊕1⊕1⊕1⊕1->1
得到错误位S4S3S2S1:1011,转为十进制为 11,是否说明了 H11 位出错了呢?
所以海明码只有一位的纠错能力。
全校验位
为了保证海明码的校验能力,引入全校验位,对海明码整体进行偶校验
由于要进行偶校验,上面的海明码有八个 1,所以最高位 H13 是 0:
| H13 | H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| P5 | D8 | D7 | D6 | D5 | P4 | D4 | D3 | D2 | P3 | D1 | P2 | P1 |
| 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
最终的海明码为:0101001011111
总结
海明码原理:
- 确定海明码位数:信息位(n) + 校验位(k)
- 通过信息位算出校验位:
2^k >= n+k+1
- 通过信息位算出校验位:
- 校验位的位置编号:
2^(k-1) - 将信息位填入剩余位置
- 把信息位的位置编号用二进制数表示
- 二进制数的每一位对应校验位
- 将二进制数是
1的进行组合
- 将二进制数是
- 用异或运算算出校验位,得到海明码
- 对海明码整体进行偶校验得到最终的海明码
判断依据:
S4S3S2S1=0000且偶检验成功:无错误S4S3S2S1≠0000且偶检验失败:一位错误,纠正即可S4S3S2S1≠0000且偶检验成功:两位错误,需重传