校驗碼——揭開海明校驗碼求解之謎
引言
計算機系統在執行時,各個部件之間要進行資料交換,為了確保資料在傳送過程中正確無誤,通常使用校驗碼的方法來檢測傳送的資料是否出錯。合理的設計錯誤編碼以及編碼規則,捨得資料在傳送中出現某種錯誤時會變成錯誤編碼,這樣就可以檢測出接收到的資料是否有錯。
校驗碼
通常是一組數字的最後一位,由前面的數字通過某種運算得出,用以檢驗該組數字的正確性。常見的校驗碼有中華人民共和國居民身份證的最後一位、ISBN號碼的最後一位、組織機構程式碼的最後一位、資料傳輸的正確性驗證碼等。
書上介紹了三種校驗碼:奇偶校驗碼、海明校驗碼和迴圈冗餘校驗碼。
奇偶校驗碼:通過在編碼中增加一位校驗位來使編碼中1的個數為奇數或者為偶數,從而使碼距變為2。對於奇校驗,可以檢測出程式碼中奇數位出錯的程式碼,但是不能發現偶數位出錯的情況。常用的有三種:水平奇偶校驗碼、垂直奇偶校驗碼和水平垂直校驗碼。
迴圈冗餘校驗碼:利用生成多項式為k個數據位產生r個校驗位來進行編碼,其編碼長度為k+r。在求CRC編碼時,採用的是模2運算。(加減運算的規則是按位運算,不發生借位和進位。)
這裡我們主要介紹一下海明校驗碼。之前視訊中也講過海明校驗碼,但是看完視訊就蒙了,想著反正我們的學習是反覆的,現在什麼都不懂沒事,先知道有這麼個高大上的東西,之後還是會遇到的。然後再看書專項複習階段,又遇到了,研究一下,通過視訊中的例子來給大家分享。
海明校驗碼
視訊中的例子:求資訊1011的海明碼。
首先,我們要知道海明校驗碼的實現原理:在K個數據位之外加上r個校驗位,從而形成一個K+r位的新的碼字,使新的碼字的碼距比較均勻的拉大。
步驟:
1、根據資訊位,確定校驗位數
根據公式2^r≥k+r+1,其中k為資訊位,r為校驗位數。因為1011共四位,所以k=4,求得r最小應該是3.
由於資訊位和校驗位一共是7位,所以海明碼的位數是7位,由此確定初步的表格:
位數 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
資訊位 |
|||||||
校驗位 |
2、分配校驗位和資訊位
2.1分配校驗位
因為校驗位位置分配的規律是一般都放置在2^n上,也就是1、2、4、8……位置。得到如下的表格:
位數 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
資訊位 |
|||||||
校驗位 |
R1 |
R2 |
R3 |
2.2分配資訊位
資訊位的位置分配是從高位到低位依次存放。得到如下的表格:
位數 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
資訊位 |
1 |
1 |
0 |
1 |
|||
校驗位 |
R1 |
R2 |
R3 |
注意:資訊位從高位到低位依次排列,如果該位置被校驗位佔據之後就往後移,直到沒有被佔據的空位。
3、確定校驗位的值
想要確定校驗位的值,那我們就應該知道上面的資訊位都是由哪幾個校驗位來進行校驗的。
校驗原則:被校驗的海明位的下標等於所有參與校驗該為的校驗位的下標之和。即想要校驗的資訊位的位置(i)等於校驗位的位置值相加。例如:我們要校驗第三位,3=2+1,也就是用R1和R2來校驗第3位。
由此原則得到每一個位置相對應的校驗位表:
海明碼 |
海明碼的下標 |
校驗位組 |
1 |
1 |
R1 |
2 |
2 |
R2 |
3 |
3=2+1 |
R1,R2 |
4 |
4 |
R3 |
5 |
5=4+1 |
R3,R1 |
6 |
6=4+2 |
R3,R2 |
7 |
7=4+2+1 |
R3,R2,R1 |
通過上面的表,我們知道了每一個校驗碼對應的校驗的資訊位:
校驗碼名稱 |
校驗的資訊位 |
R1 |
1,3,5,7 |
R2 |
2,3,6 |
R3 |
4,5,6,7 |
4、求校驗位的值
通過以上的表,我們根據每個校驗位校驗的資訊位的值進行異或運算,得出每個校驗位的值。
異或運算:異或的數學符號為“⊕”,計算機符號為“xor”。其運演算法則為:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
即如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同,異或結果為0。
例如:求R1的值
我們從以上的表中得知:R1是用來校驗1、3、5、7位的。而1對應的資訊位是空的,3、5、7對應的資訊位都是1。
由此得出R1=1
同理求出R2=0,R3=0
5、將整個表補齊
位數 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
資訊位 |
1 |
1 |
0 |
1 |
|||
校驗位 |
R1=1 |
R2=0 |
R3=0 |
將上面的數按照從低位到高位的排列順序得到:1010101,就是我們要的海明碼。
6、海明校驗碼的規律:
通過上面的表,我們知道一個資訊位會被多個校驗位進行校驗,所以當某一位出錯後,就會引起相關的幾個校驗位的值發生變化,這不但可以發現出錯,還能指出是哪一位出錯了,為進一步自動糾錯提供了依據。
小結
有的時候我們就是應該將自己現在不懂的內容先放一下,因為我們會進行反覆的學習,現在不懂只是因為我們還沒到那個點上,要相信,終有一個點,我們會大徹大悟!
上面的內容雖然步驟可以整出來,但是有好多的名詞有點疑惑,所以如果有問題,還請大家斧正!