1 概述
1.1 介绍
- 海明码:或称 海明校验码,是 Richard Hamming 在 1950 年提出,还被广泛采用的一种很有效的校验方法
1.2 约定原则
- 海明码只能检测出 2 位错,纠 1 位错
- 海明码默认进行 偶校验
- 海明码是一串由 0 和 1 组成的序列
2 常用概念
2.1 海明距离
- 定义:一个码字要变成另一个码字时必须要改变的最小位数
- 理解:不同位的个数,举例如下
- 0101 => 0100:不同位的个数为 1 位,故海明距离是 1
- 0101 => 0000:不同位的个数为 2 位,故海明距离是 2
2.2 海明不等式
- 公式:
2
k
≥
m
+
k
+
1
2^k \geq m + k + 1
2k≥m+k+1
2.3 编码方式:校验位 + 数据位
- ① 校验位 和 数据位 的 确定规则:第
2
i
2^i
2i(i = 0, 1, 2, 3…) 位是 校验位,其余是 数据位
- ② 校验位 和 数据位 的 对应关系:每个 校验位,会校验参加该位置进行计算的 数据位(如下图)
按 行 勾选的部分 => 数值计算,如
12
=
4
+
8
=
2
2
+
2
3
12 = 4 + 8 = 2^2 + 2^3
12=4+8=22+23
按 列 勾选的部分 => 参加校验位的部分,如:
参加位置 1 校验的有:1、3、5、7、9、11,其中 1 是校验位,其他是数据位
参加位置 2 校验的有:2、3、6、7、10、11,其中 2 是校验位,其他是数据位
参加位置 4 校验的有:4、5、6、7、12,其中 4 是校验位,其他是数据位
参加位置 8 校验的有:8、9、10、11、12,其中 8 是校验位,其他是数据位
位置 | 1=
2
0
2^0
20 | 2=
2
1
2^1
21 | 4=
2
2
2^2
22 | 8=
2
3
2^3
23 |
---|
1 | √ | | | |
2 | | √ | | |
3 | √ | √ | | |
4 | | | √ | |
5 | √ | | √ | |
6 | | √ | √ | |
7 | √ | √ | √ | |
8 | | | | √ |
9 | √ | | | √ |
10 | | √ | | √ |
11 | √ | √ | | √ |
12 | | | √ | √ |
- 举例:假设要传送的数据是 0100 1101,按 偶校验 进行计算
- 根据题干 “0100 1101” 可知,数据位是 8 位(m=8)
- 根据 “海明不等式” 可知,校验位最小是 4 位(k=4)
- 根据 “校验位 和 数据位 的对应关系”,得到 “偶校验计算结果”,完成下表,如
- 校验位 1 对应的数据位分别是:3、5、7、9、11 => 10101 => 校验位为 1
- 校验位 2 对应的数据位分别是:3、6、7、10、11 => 11101 => 校验位为 0
- 校验位 4 对应的数据位分别是:5、6、7、12 => 0110 => 校验位为 0
- 校验位 8 对应的数据位分别是:9、10、11、12 => 0010 => 校验位为 1
位置 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|
校验位 | | | | |
2
3
2^3
23 | | | |
2
2
2^2
22 | |
2
1
2^1
21 |
2
0
2^0
20 |
数据位 | 0 | 1 | 0 | 0 | | 1 | 1 | 0 | | 1 | | |
偶校验计算结果 | | | | | 1 | | | | 0 | | 0 | 1 |
海明码(最终结果) | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
3 扩展
3.1 奇偶校验
- 原理:根据被传输的一组二进制代码的数位中 “1” 的个数 是 奇数 或 偶数 来进行校验
- 实现:增加一位校验位,在数据位前、后都行,如下
校验 | 数据位 | 最终数据 | 说明 |
---|
奇校验 | 1011 010 | 1011 0101 | 数据位有 4 个 1,那么校验位为 1,才能保证有奇数个 1 |
1011 011 | 1011 0110 | 数据位有 5 个 1,那么校验位为 0,才能保证有奇数个 1 |
偶校验 | 1011 010 | 1011 0100 | 数据位有 4 个1,那么校验位为 0,才能保证有偶数个 1 |
1011 011 | 1011 0111 | 数据位有 5 个1,那么校验位为 1,才能保证有偶数个 1 |
1 个字节 = 8 个数据位
当发送数据是:1011 0101,接受到的数据是:1011 0100
时,就会发现 1 的个数有 1 个不同,从而能检测到错误
注意:只能发现有 1 位错误,而且还不知道是哪位