二進制數(shù)據(jù)經(jīng)過傳送、存取等環(huán)節(jié),會發(fā)生誤碼(1變成0或0變成1),這就有如何發(fā)現(xiàn)及糾正誤碼的問題。所有解決此類問題的方法就是在原始數(shù)據(jù)(數(shù)碼位)基礎上增加幾位校驗位。我們常使用的檢驗碼有三種. 分別是奇偶校驗碼、海明校驗碼和循環(huán)冗余校驗碼(CRC)。
海明校驗碼是由RichardHamming于1950年提出、目前還被廣泛采用的一種很有效的校驗方法。它的實現(xiàn)原理,是在k個數(shù)據(jù)位之外加上r個校驗位,從而形成一個k+r位的新的碼字,使新的碼字的碼距比較均勻地拉大。把數(shù)據(jù)的每一個二進制位分配在幾個不同的偶校驗位的組合中,當某一位出錯后,就會引起相關的幾個校驗位的值發(fā)生變化,這不但可以發(fā)現(xiàn)出錯,還能指出是哪一位出錯,為進一步自動糾錯提供了依據(jù)。但是因為這種海明校驗的方法只能檢測和糾正一位出錯的情況。所以如果有多個錯誤,就不能查出了。
什么是碼距?
兩個碼組對應位上數(shù)字的不同位的個數(shù)稱為碼組的距離,簡稱碼距,又稱海明(Hamming)距離。例如00110和00100碼距為1,12345和13344碼距為2,Caus和Daun碼距為2。
海明校驗碼公式(假設為k個數(shù)據(jù)位設置r個校驗位)
2^r-1 ≥ k + r
公式怎么得出來的呢?
假設有r個校驗位,一個位子有0或1兩種情況,r個位子就有2r種排列情況,能表示2r種狀態(tài)。其中一個狀態(tài)用來表示正確(沒有錯誤發(fā)生)的這種情況。其余的2r-1種狀態(tài)來表示錯誤發(fā)生在哪一位??偣灿衚+r位,所以2r-1一定要>=總位子k+r。
按照該不等可以得出k與r的對應關系
| k值 | r值 |
|---|---|
| 1 | 2 |
| 2~4 | 3 |
| 5~11 | 4 |
| 12~26 | 5 |
| 27~57 | 6 |
| 58~120 | 7 |
| ... | ... |
注意:海明校驗碼是放在2的冪次位上的,即“1,2,4,8,16,32······”
實戰(zhàn)求1011的海明碼
第一步:求r的值(即校驗位數(shù))
直接根據(jù)公式代入得:
2^r-1 ≥ 4 + r
2^r-r ≥ 5
得到r最小為3
所以海明碼的位數(shù)是4+3=7位
第二步:校驗位和信息位對號入座
注意: 信息位的位置分配是從高位到低位依次存放
注意: 海明校驗碼是放在2的冪次位上的
位數(shù)|1|2|3|4|5|6|7
:-:|:-:|:-:|:-:|:-:|:-:|:-:
信息位|||1||1|0|1
校驗位|r1|r2||r3|||
第三步:確定校驗位的值
校驗原則:被校驗的海明位的下標等于所有參與校驗該為的校驗位的下標之和
| 海明碼 | 海明碼下標 | 校驗位組 | 信息位 |
|---|---|---|---|
| 1 | 1 | r1 | |
| 2 | 2 | r2 | |
| 3 | 3=2+1 | r1,r2 | 1 |
| 4 | 4 | r3 | |
| 5 | 5=4+1 | r3,r1 | 1 |
| 6 | 6=4+2 | r3,r2 | 0 |
| 7 | 7=4+3 | r3,r2,r1 | 1 |
然后將校驗碼校驗的信息位的位置記錄下來:
- r1: 3, 5, 7
- r2: 3, 6, 7
- r3: 5, 6, 7
然后做對應信息位的異或運算(異或的運算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1))
- r1: 1 xor 1 xor 1 = 1
- r2: 1 xor 0 xor 1 = 0
- r3: 1 xor 0 xor 1 = 0
代入表格得到
| 位數(shù) | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 信息位 | 1 | 1 | 0 | 1 | |||
| 校驗位 | 1 | 0 | 0 |
注意:按照從低位到高位的排列順序得到海明碼:1010101