海明码(Hamming Code),即汉明码,是一种纠错码。可以在数据传输中发生错误时,查找出出错的位置,从而纠正错误。需要强调的是,海明码只能纠错一位,当有多位出错时,是纠不了的。
下面以发送二进制数据:
1011 0110
为例,简述海明码的工作原理。
发送方
步骤一、往数据中插入校验码,先用字母代替。A插在第1个位置,B插在第2个位置,C插在第4个位置,D插在第8个位置,以此类推。下一个字母E应该插在第16个位置,但该数据当前总共12位(8位原本的数据 + 4位插入的校验码),位数不够。因此结果为:
AB1C 011D 0110
步骤二、给字母编码:
当前总共12位,故用4个二进制位即可。
十进制 |
1 |
2 |
3 |
4 |
5 |
6 |
二进制 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
十进制 |
7 |
8 |
9 |
10 |
11 |
12 |
二进制 |
0111 |
1000 |
1001 |
1010 |
1011 |
1100 |
步骤三、计算字母。
将之前插入的字母用比特(0或1)来代替。计算方法如下:
对于“A”,计算以上二进制最低位对应是“1”的数,有1、3、5、7、9、11。这六个数的最低位是1。然后再将数据“AB1C 011D 0110”对于的第1、3、5、7、9、11位相加。
A = ∑( 1, 3, 5, 7, 9, 11 ) = ∑( 0, 1, 0, 1, 0, 1 ) = 1
由于第1位是A,算是0。第3位是1,第5位是0,第7位是1,第9位是0,第11位是1,所以A用1代替。(0+1+0+1+0+1=1,无进位加)
计算时,该步骤的字母算作0。
以此类推:对于B,计算以上二进制位对于是1的数:2、3、6、7、10、11。在数据中这些位对于的数分别是B、1、1、1、1、1。所以和为1。
类似地,计算出C = 0, D = 0。
十进制 |
数据 |
D |
C |
B |
A |
二进制 |
|||||
1 |
A |