1. 程式人生 > >校驗碼——揭開海明校驗碼求解之謎

校驗碼——揭開海明校驗碼求解之謎

引言

       計算機系統在執行時,各個部件之間要進行資料交換,為了確保資料在傳送過程中正確無誤,通常使用校驗碼的方法來檢測傳送的資料是否出錯。合理的設計錯誤編碼以及編碼規則,捨得資料在傳送中出現某種錯誤時會變成錯誤編碼,這樣就可以檢測出接收到的資料是否有錯。

校驗碼

       通常是一組數字的最後一位,由前面的數字通過某種運算得出,用以檢驗該組數字的正確性。常見的校驗碼有中華人民共和國居民身份證的最後一位、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、海明校驗碼的規律:

       通過上面的表,我們知道一個資訊位會被多個校驗位進行校驗,所以當某一位出錯後,就會引起相關的幾個校驗位的值發生變化,這不但可以發現出錯,還能指出是哪一位出錯了,為進一步自動糾錯提供了依據。

小結

       有的時候我們就是應該將自己現在不懂的內容先放一下,因為我們會進行反覆的學習,現在不懂只是因為我們還沒到那個點上,要相信,終有一個點,我們會大徹大悟!

       上面的內容雖然步驟可以整出來,但是有好多的名詞有點疑惑,所以如果有問題,還請大家斧正!