概念
海明碼(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,表示第八位存在異常。