1. 程式人生 > >海明校驗碼

海明校驗碼

直觀 因此 span 錯位 二進制位 奇偶校驗位 成了 solid 等式成立

一、概述

  由Richard Hamming於1950年提出、目前還被廣泛采用的一種很有效的校驗方法,是只要增加少數幾個校驗位,就能檢測出二位同時出錯、亦能檢測出一位出錯並能自動恢復該出錯位的正確值的有效手段,後者被稱為自動糾錯。它的實現原理,是在k個數據位之外加上r個校驗位,從而形成一個k+r位的新的碼字,使新的碼字的碼距比較均勻地拉大。把數據的每一個二進制位分配在幾個不同的偶校驗位的組合中,當某一位出錯後,就會引起相關的幾個校驗位的值發生變化,這不但可以發現出錯,還能指出是哪一位出錯,為進一步自動糾錯提供了依據。

二、基本思想

  將有效信息按某種規律分成若幹組,每組安排一個校驗位,做奇偶測試,就能提供多位檢錯信息,以指出最大可能是哪位出錯,從而將其糾正。實質上,海明校驗是一種多重校驗。

三、特點

  它不僅具有檢測錯誤的能力,同時還具有給出錯誤所在準確位置的能力 但是因為這種海明校驗的方法只能檢測和糾正一位出錯的情況。所以如果有多個錯誤,就不能查出了。  假設為k個數據位設置r個校驗位,則校驗位能表示2^r個狀態,可用其中的一個狀態指出 "沒有發生錯誤",用其余的2 ^r -1個狀態指出有錯誤發生在某一位,包括k個數據位和r個校驗位,因此校驗位的位數應滿足如下關系:                               2^r-1 ≥ k + r (2.8)
k值 最小r值
1 2
2~4 3
5~11 4
12~26 5
27~57 6
58~120 7
四、分組原則   在海明碼中, 位號數(1、2、3、……、n)為2的權值的那些位,即:1(2^0)、2(2^1)、4(2^2)、8(2^3)、…2^(r-1)位,作為奇偶校驗位,並記作: P1、P2、P3 、P4、…Pr,余下各位則為有效信息位。例如: N=11(海明碼位數)K=7(數據位數)r=4(校驗位) ,相應海明碼可表示位號為: 1, 2, 3, 4 ,5 ,6, 7, 8, 9 ,10 ,11,校驗位P占第1,2,4,8位,其他位為有效信息位,海明碼中的校驗位分別標示為P1,P2,P3,P4… Pr ,並被信息位中的一至若幹位所校驗,其規律是:第i位,由校驗位位號之和等於i的那些校驗位所校驗,如:海明碼的位號為3,它被P1P2(位號分別為1,2)所校驗,海明碼的位號為5,它被P1P3(位號分別為1,4)所校驗。歸並起來: 形成了4個小組,每個小組一個校驗位,校驗位的取值,仍采用奇偶校驗方式確定。
五、實例   海明碼(也叫漢明碼)具有一位糾錯能力。本文以1010110這個二進制數為例解釋海明碼的編碼和校驗方法。

  1、編碼確定校驗碼的位數x

  設數據有n位,校驗碼有x位。則校驗碼一共有2x種取值方式。其中需要一種取值方式表示數據正確,剩下2x-1種取值方式表示有一位數據出錯。因為編碼後的二進制串有n+x位,因此x應該滿足

2x-1 ≥ n+x   

  使不等式成立的x的最小值就是校驗碼的位數。在本例中,n=7,解得x=4。

  2、確定校驗碼的位置

  校驗碼在二進制串中的位置為2的整數冪。剩下的位置為數據。如圖所示。

位置 1 2 3 4 5 6 7 8 9 10 11
內容 x1 x2 1 x3 0 1 0 x4 1 1 0

  3、求出校驗位的值

  以求x2的值為例。為了直觀,將表格中的位置用二進制表示。

位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
內容 x1 x2 1 x3 0 1 0 x4 1 1 0

  為了求出x2,要使所有位置的第二位是1的數據(即形如**1*的位置的數據)的異或值為0。即x2^1^1^0^1^0 = 0。因此x2 = 1。

  同理可得x1 = 0, x3 = 1, x4 = 0。

位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
內容 0 1 1 1 0 1 0 0 1 1 0

  因此1010110的海明碼為01110100110。

  4、校驗

  假設位置為1011的數據由0變成了1,校驗過程為:

  將所有位置形如***1, **1*, *1**, 1***的數據分別異或。

  ***1: 0^1^0^0^1^1 = 1

  **1*: 1^1^1^0^1^1 = 1

  *1**: 1^0^1^0 = 0

  1***: 0^1^1^1 = 1

  以上四組中,如果一組異或值為1,說明該組中有數據出錯了。***1 **1* 1***的異或都為1,說明出錯數據的位置為1011。

海明校驗碼