概念
海明码(Hamming Code)是一种利用奇偶性来检错和纠错的校验方法。海明码的构成方法是在数据位之间的特定位置上插入k个校验位,通过扩大码距来实现检错和纠错。
要点
现在举个例子,以下均以该例子说明。
例子:
有个数据位为8的数据D7D6D5D4D3D2D1D0=01101001,求海明码。
先上结果:
H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | P4 | D3 | D2 | D1 | P3 | D0 | P2 | P1 |
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 0 | P4 | 1 | 0 | 0 | P3 | 1 | P2 | P1 |
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
要点1(计算校验位个数)
设数据位是n位,校验位是k位,则n和k必须满足以下关系:
2k - 1 ≥ n + k
例如一个数据的数据位为8位,求需要多少位校验码,则有2k - 1 ≥ 8 + k,可以得到k最小应该为4,即24 - 1 ≥ 8 + 4。
要点2(计算校验位位置)
2-1 (海明码总位数)
设校验位为P,数据位为D,海明码为H,则海明码H的位数为校验码和数据的位数相加。
2-2 (校验码位置)
校验位P在海明码的第2i-1位,即Hj = Pi,j=2i-1,i从1开始计数。无论是海明码、校验位还是数据位,均从右向左排列,即从低位向高位排列。
可先填入校验码的位置,再将数据位依次从低位到高位填入。
例如:
H12 | H11 | H10 | H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | P4(24-1位) | D3 | D2 | D1 | P3(23-1位) | D0 | P2(22-1位) | P1(21-1位) |
要点3 (数据由哪些校验码进行校验)
根据上面求出的校验码的位置或者2i-1的公式,即可知道P4、P3、P2、P1的下标分别为8、4、2、1。
现在要确定一下每位数据均由哪些校验码进行校验的。
方法:数据为的下标等于校验位的下标之和。
D0=H3,3=2+1,即用H2、H1进行校验,即P2、P1。
D1=H5,5=4+1,即用H4、H1进行校验,即P3、P1。
D2=H6,6=4+2,即用H4、H2进行校验,即P3、P2。
D3=H7,7=4+2+1,即用H4、H2、H1进行校验,即P3、P2、P1。
D4=H9,9=8+1,即用H8、H1进行校验,即P4、P1。
D5=H10,10=8+2,即用H8、H2进行校验,即P4、P2。
D6=H11,11=8+2+1,即用H8、H2、H1进行校验,即P4、P2、P1。
D7=H12,12=8+4,即用H8、H4进行校验,即P4、P3。
要点4 (计算校验码的值)
校验码的值为有参与校验的数据依次从低到高异或的值。
由要点3可以看出以下规律:
P1参与了D0、D1、D3、D4、D6等数据位的校验。
P2参与了D0、D2、D3、D5、D6等数据位的校验。
P3参与了D1、D2、D3、D7等数据位的校验。
P4参与了D4、D5、D6、D7等数据位的校验。
所以:(D7D6D5D4D3D2D1D0=01101001)
P1 = D0⊕D1⊕D3⊕D4⊕D6 = 1⊕0⊕1⊕0⊕1 = 1
P2 = D0⊕D2⊕D3⊕D5⊕D6 = 1⊕0⊕1⊕1⊕1 = 0
P3 = D1⊕D2⊕D3⊕D7 = 0⊕0⊕1⊕0 = 1
P4 = D4⊕D5⊕D6⊕D7 = 0⊕1⊕1⊕0 = 0
要点5(错误校验)
确定错误校验G4G3G2G1,校验码有几位,错误校验就有几位。
如果采用偶校验则结果全为0时没有错误,如果采用奇校验则结果全为1时没有错误
G1 = P1D0⊕D1⊕D3⊕D4⊕D6 = 1⊕1⊕0⊕1⊕0⊕1 = 0
G2 = P2D0、D2、D3、D5、D6 = 0⊕1⊕0⊕1⊕1⊕1 = 0
G3 = P3D1、D2、D3、D7 = 1⊕0⊕0⊕1⊕0 = 0
G4 = P4D4、D5、D6、D7 = 0⊕0⊕1⊕1⊕0 = 0
则G4G3G2G1 = 0000,表示没有异常。假如结果为0100则转为十进制为8,表示第八位存在异常。