- 对于原始数据信息位m,计算得出需要的k位校验码
- 如何确定最小的校验位数 k k k
假设原有信息为 m m m位,则和校验位加起来长度有 m + k m+k m+k.校验位数k可以确定 $2^k $个状态,这些状态中必有一个其所有奇偶测试都是真的,于是剩下 2 k − 1 2^k-1 2k−1 种状态。所以通过 2 k − 1 > = m + k 2^k-1>=m+k 2k−1>=m+k 可以算出 k k k
如原始信息为0110 1110 8位 2 k − 1 > = 8 + k 2^k-1>=8+k 2k−1>=8+k导出 k = 4 k=4 k=4
- 如何确定最小的校验位数 k k k
- 海明校验码是放在2的幂次位上的,如 1,2,4,8,16…等
- 计算校验码
来一波例子,假设原始信息为
| 位置 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| 原始信息位 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
第一步
计算出K=4
第二步
确定校验码的位置在1 ,2 ,4,8位置上
则新的信息位:
| 位置 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 新的信息位 | 0 | 1 | 1 | 0 | H8 | 1 | 1 | 1 | H4 | 0 | H2 | H1 |
第三步
计算校验位的值,也是最为关键的一步
| 位置 | 二进制码 |
|---|---|
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 0101 |
| 6 | 0110 |
| 7 | 0111 |
| 8 | 1000 |
| 9 | 1001 |
| 10 | 1010 |
| 11 | 1011 |
| 12 | 1100 |
| 海明码 | 出现的位置 | 对应位置上的值异或 | 结果 |
|---|---|---|---|
| H1 | 3,5,7,9,11 | 0⊕1⊕1⊕0⊕1 | 1 |
| H2 | 3,6,7,10,11 | 0⊕1⊕1⊕1⊕1 | 0 |
| H4 | 5,6,7,12 | 1⊕1⊕1⊕0 | 1 |
| H8 | 9,10,11,12 | 0⊕1⊕1⊕0 | 0 |
最终的信息位为
| 位置 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 最终信息位 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
校验码H8H4H2H1 = 0101
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198813.html原文链接:https://javaforall.net
