海明碼(漢明碼)
概念
漢明碼(Hamming Code),是在電信領域的一種線性調試碼,以發明者理查德·衛斯里·漢明的名字命名。漢明碼在傳輸的消息流中插入驗證碼,當計算機存儲或移動數據時,可能會產生數據位錯誤,以偵測並更正單一比特錯誤。由於漢明編碼簡單,它們被廣泛應用於內存(RAM)。——百度百科
編碼方式
海明碼可以對一位比特錯誤起到檢錯和糾錯的作用,對於海明碼的編碼方式包涵以下幾個過程
確定校驗位數
在海明碼中,校驗位(\(x\))和信息位(\(y\))滿足如下關系:
根據此公式容易求出檢驗位和信息位的數量,有如下對應關系:
信息位位數 | 1 | 2~4 | 5~11 | 12~26 | 27~57 | 58~120 |
---|---|---|---|---|---|---|
校驗碼位數 | 2 | 3 | 4 | 5 | 6 | 7 |
確定校驗位位置
海明碼中校驗位位置是固定的均為2的冪次的位置(1,2,4,8,……)
確定校驗位的值
海明碼編碼時對於每個校驗位會將信息位分組,每一個校驗位會覆蓋多個信息位,對每個校驗位其能覆蓋的信息位有如下特點:
對於每個校驗位所覆蓋的區域,采用校驗方式確定校驗碼的值,一般為偶校驗
糾錯和檢錯
確定校驗位數
在得到海明碼之后,我們可以通過總位數來計算出相應的信息位和檢驗位各有多少,根據上述公式即可,同理即可得到校驗位地址,並獲得各個校驗碼
檢錯
假設各個校驗碼是由偶校驗得到的,那么我們再次計算接收端的海明碼對應的各個校驗位的值,然后將新得到的校驗位的值與發送來的值相比較,相同則證明該校驗位覆蓋的范圍內的信息位全部是正確的,否則則該校驗碼所覆蓋的范圍內的信息位存在錯誤,通過各個校驗碼的比較我們可以確定那幾個分組存在錯誤,通過查看分組的交集,便可以確定錯誤的信息位的位置
糾錯
得到錯誤的信息位之后,對其取反即可
示例
發送端信息碼:1010110
信息碼位數為7,所以可以確定校驗碼位數為4,海明碼總位數為11
校驗碼位置為:1,2,4,8
計算校驗碼的值:(偶校驗方式)
獲得海明碼為:01110100110
接收端海明碼為:01110100111
確定校驗位:1,2,4,8
計算校驗碼值:
由此確定錯誤位為11位,因為特殊的分組方式,所以這里計算結果從高位開始排出為1011(二進制)=11,也可確定錯誤位