一.什么是海明码?
要了解海明码,首先我们需要知道什么是校验码。即计算机系统运行时,为了确保数据在传送过程中正确无误,一是提高硬件电路的可靠性,二是提高代码的校验能力,包括查错和纠错。通常使用校验码的方法来检测传送的数据是否出错。其基本思想是把数据可能出现的编码分为两类:合法编码和错误编码。合法编码用于传送数据,错误编码是不允许在数据中出现的编码。合理地设计错误编码以及编码规则,使得数据在传送中出现某种错误时会变成错误编码,这样就可以检测出接收到的数据是否有错。
海明码是由贝尔实验室的Richard Hamming设计的,是一种利用奇偶性来检错和纠错的校验方法。
二.海明码的运算规则
海明码的运算规则:设 k k k个校验位为 P k , P k − 1 , … , P 1 P_{k},P_{k-1},\ldots ,P_{1} Pk,Pk−1,…,P1, n n n个数据位为 D n − 1 , D n − 2 , … , D 1 , D 0 D_{n-1},D_{n-2},\ldots ,D_{1},D_{0} Dn−1,Dn−2,…,D1,D0,对应的海明码为 H n + k , H n + k − 1 , … , H 1 H_{n+k},H_{n+k-1},\ldots ,H_{1} Hn+k,Hn+k−1,…,H1,那么:
(1) P i P_{i} Pi在海明码的第 2 i − 1 2^{i-1} 2i−1位置,即 H j H_{j} Hj= P i P_{i} Pi,且 j = 2 i − 1 j=2^{i-1} j=2i−1,数据位则依序从低到高占据海明码中剩下的位置。
(2)海明码中的任何一位都是由若干个校验位来校验的。其对应关系如下:被校验的海明位的下标等于所有参与校验该位的校验位的下标之和,而校验位由自身校验。
【例】设数据为01101001,试采用4个校验位求其偶校验方式的海明码。
解: 该数据共有8个数据位,根据公式:
2
k
−
1
≥
n
+
k
2^k-1 \geq n+k
2k−1≥n+k
即
2
k
−
1
≥
8
+
k
2^k-1 \geq 8+k
2k−1≥8+k知:
k
k
k=4。即进行海明校验需要4个校验位。
(1)确定D与P在海明码中的位置,如下表所示:
H 12 H_{12} H12 | H 11 H_{11} H11 | H 10 H_{10} H10 | H 9 H_{9} H9 | H 8 H_{8} H8 | H 7 H_{7} H7 | H 6 H_{6} H6 | H 5 H_{5} H5 | H 4 H_{4} H4 | H 3 H_{3} H3 | H 2 H_{2} H2 | H 1 H_{1} H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
D 7 D_{7} D7 | D 6 D_{6} D6 | D 5 D_{5} D5 | D 4 D_{4} D4 | P 4 P_{4} P4 | D 3 D_{3} D3 | D 2 D_{2} D2 | D 1 D_{1} D1 | P 3 P_{3} P3 | D 0 D_{0} D0 | P 2 P_{2} P2 | P 1 P_{1} P1 |
0 | 1 | 1 | 0 | — | 1 | 0 | 0 | — | 1 | — | — |
(2)确定校验关系,如下表所示:
海明码 | 海明码的下标 | 校验位组 |
---|---|---|
H 1 ( P 1 ) H_{1}(P_{1}) H1(P1) | 1 | P 1 P_{1} P1 |
H 2 ( P 2 ) H_{2}(P_{2}) H2(P2) | 2 | P 2 P_{2} P2 |
H 3 ( D 0 ) H_{3}(D_{0}) H3(D0) | 3=1+2 | P 1 , P 2 P_{1},P_{2} P1,P2 |
H 4 ( P 3 ) H_{4}(P_{3}) H4(P3) | 4 | P 3 P_{3} P3 |
H 5 ( D 1 ) H_{5}(D_{1}) H5(D1) | 5=1+4 | P 1 , P 3 P_{1},P_{3} P1,P3 |
H 6 ( D 2 ) H_{6}(D_{2}) H6(D2) | 6=2+4 | P 2 , P 3 P_{2},P_{3} P2,P3 |
H 7 ( D 3 ) H_{7}(D_{3}) H7(D3) | 7=1+2+4 | P 1 , P 2 , P 3 P_{1},P_{2},P_{3} P1,P2,P3 |
H 8 ( P 4 ) H_{8}(P_{4}) H8(P4) | 8 | P 4 P_{4} P4 |
H 9 ( D 4 ) H_{9}(D_{4}) H9(D4) | 9=1+8 | P 1 , P 4 P_{1},P_{4} P1,P4 |
H 10 ( D 5 ) H_{10}(D_{5}) H10(D5) | 10=2+8 | P 2 , P 4 P_{2},P_{4} P2,P4 |
H 11 ( D 6 ) H_{11}(D_{6}) H11(D6) | 11=1+2+8 | P 1 , P 2 , P 4 P_{1},P_{2},P_{4} P1,P2,P4 |
H 12 ( D 7 ) H_{12}(D_{7}) H12(D7) | 12=4+8 | P 3 , P 4 P_{3},P_{4} P3,P4 |
⨁ \bigoplus ⨁:异或,又称半加运算。二进制下用1表示真,用0表示假
运算法则: 0 ⨁ 0 = 0 0\bigoplus0=0 0⨁0=0, 1 ⨁ 0 = 1 1\bigoplus0=1 1⨁0=1, 0 ⨁ 1 = 1 0\bigoplus1=1 0⨁1=1, 1 ⨁ 1 = 0 1\bigoplus1=0 1⨁1=0
P
1
校验:
P
1
、
D
0
、
D
1
、
D
3
、
D
4
、
D
6
P_{1}校验:P_{1}、D_{0}、D_{1}、D_{3}、D_{4}、D_{6}
P1校验:P1、D0、D1、D3、D4、D6
即
P
1
=
D
0
⨁
D
1
⨁
D
3
⨁
D
4
⨁
D
6
=
1
P_{1}=D_{0}\bigoplus D_{1}\bigoplus D_{3}\bigoplus D_{4}\bigoplus D_{6}=1
P1=D0⨁D1⨁D3⨁D4⨁D6=1
P
2
校验:
P
2
、
D
0
、
D
2
、
D
3
、
D
5
、
D
6
P_{2}校验:P_{2}、D_{0}、D_{2}、D_{3}、D_{5}、D_{6}
P2校验:P2、D0、D2、D3、D5、D6
即
P
2
=
D
0
⨁
D
2
⨁
D
3
⨁
D
5
⨁
D
6
=
0
P_{2}=D_{0}\bigoplus D_{2}\bigoplus D_{3}\bigoplus D_{5}\bigoplus D_{6}=0
P2=D0⨁D2⨁D3⨁D5⨁D6=0
P
3
校验:
P
3
、
D
1
、
D
2
、
D
3
、
D
7
P_{3}校验:P_{3}、D_{1}、D_{2}、D_{3}、D_{7}
P3校验:P3、D1、D2、D3、D7
即
P
3
=
D
1
⨁
D
2
⨁
D
3
⨁
D
7
=
1
P_{3}=D_{1}\bigoplus D_{2}\bigoplus D_{3}\bigoplus D_{7}=1
P3=D1⨁D2⨁D3⨁D7=1
P
4
校验:
P
4
、
D
4
、
D
5
、
D
6
、
D
7
=
0
P_{4}校验:P_{4}、D_{4}、D_{5}、D_{6}、D_{7}=0
P4校验:P4、D4、D5、D6、D7=0
即
P
4
=
D
4
⨁
D
5
⨁
D
6
⨁
D
7
P_{4}=D_{4}\bigoplus D_{5}\bigoplus D_{6}\bigoplus D_{7}
P4=D4⨁D5⨁D6⨁D7
对校验位进行校验看那些数据位使用该校验位,例如
D
0
、
D
1
、
D
3
、
D
4
、
D
6
D_{0}、D_{1}、D_{3}、D_{4}、D_{6}
D0、D1、D3、D4、D6 使用
P
1
P_{1}
P1 从而可得
P
1
P_{1}
P1 对应的校验位
即求得的海明码为:
H 12 H_{12} H12 | H 11 H_{11} H11 | H 10 H_{10} H10 | H 9 H_{9} H9 | H 8 H_{8} H8 | H 7 H_{7} H7 | H 6 H_{6} H6 | H 5 H_{5} H5 | H 4 H_{4} H4 | H 3 H_{3} H3 | H 2 H_{2} H2 | H 1 H_{1} H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
D 7 D_{7} D7 | D 6 D_{6} D6 | D 5 D_{5} D5 | D 4 D_{4} D4 | P 4 P_{4} P4 | D 3 D_{3} D3 | D 2 D_{2} D2 | D 1 D_{1} D1 | P 3 P_{3} P3 | D 0 D_{0} D0 | P 2 P_{2} P2 | P 1 P_{1} P1 |
0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
补充:
(3)检验错误。
G
1
=
P
1
⨁
D
0
⨁
D
1
⨁
D
3
⨁
D
4
⨁
D
6
G_{1}=P_{1}\bigoplus D_{0}\bigoplus D_{1}\bigoplus D_{3}\bigoplus D_{4}\bigoplus D_{6}
G1=P1⨁D0⨁D1⨁D3⨁D4⨁D6=
G
2
=
P
2
⨁
D
0
⨁
D
2
⨁
D
3
⨁
D
5
⨁
D
6
G_{2}=P_{2}\bigoplus D_{0}\bigoplus D_{2}\bigoplus D_{3}\bigoplus D_{5}\bigoplus D_{6}
G2=P2⨁D0⨁D2⨁D3⨁D5⨁D6
G
3
=
P
3
⨁
D
1
⨁
D
2
⨁
D
3
⨁
D
7
G_{3}=P_{3}\bigoplus D_{1}\bigoplus D_{2}\bigoplus D_{3}\bigoplus D_{7}
G3=P3⨁D1⨁D2⨁D3⨁D7
G
4
=
P
4
⨁
D
4
⨁
D
5
⨁
D
6
⨁
D
7
G_{4}=P_{4}\bigoplus D_{4}\bigoplus D_{5}\bigoplus D_{6}\bigoplus D_{7}
G4=P4⨁D4⨁D5⨁D6⨁D7
偶校验下,
G
1
G
2
G
3
G
4
G_{1}G_{2}G_{3}G_{4}
G1G2G3G4全为0时表示接受到的数据无错误。若
G
1
G
2
G
3
G
4
G_{1}G_{2}G_{3}G_{4}
G1G2G3G4不全为0时说明发生了差错,而且G_{1}G_{2}G_{3}G_{4}的十进制指出了发生错误的位置。