原件故障,噪聲干擾等各種因素常常導致計算機在處理信息的過程中出現錯誤。爲了防止這種錯誤,可將信號採用專門的邏輯電路進行編碼以檢查錯誤。
1:奇偶校驗碼
奇偶校驗碼是 [1] 一種增加二進制傳輸系統最小距離的簡單和廣泛採用的方法。是一種通過增加冗餘位使得碼字中"1"的個數恆爲奇數或偶數的編碼方法,它是一種檢錯碼。在實際使用時又可分爲垂直奇偶校驗、水平奇偶校驗和水平垂直奇偶校驗等幾種。
最簡單且應用廣泛的檢驗碼就是採用一位校驗位的奇校驗或者偶校驗。在實際中出現一位錯誤的機率是最高的。
一個二進制碼字,如果它的碼元有奇數個1,就稱爲具有奇性。例如,碼字“10110101”有五個1,因此,這個碼字具有奇性。同樣,偶性碼字具有偶數個1。注意奇性檢測等效於所有碼元的模二加,並能夠由所有碼元的異或運算來確定。對於一個n位字,奇性由下式給出:奇性=a0⊕a1⊕a2⊕…⊕an
我們只需要記住奇校驗碼要保證碼字必須是奇性的,如果原碼字就是奇性的,那麼奇校驗碼就是0,反之爲1
偶校驗碼相反,保證碼字非奇性,有偶數個1,如果原碼字就是奇性的,那麼奇校驗碼就是1,反之爲0
舉個例子:
數據: 偶校驗編碼 奇校驗編碼
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1
接受數據的那端只需要判斷一下就好了,如果奇校驗中出現了偶數個1,那麼出錯了,偶校驗類比。
但是奇偶校驗只能提供是否出現一個錯誤,2個錯誤就不行了,還有出錯的地方也不可能知道的,弊端比較明顯。
2:海明碼(漢明碼也是它)
漢明碼(Hamming Code),是在電信領域的一種線性調試碼,以發明者理查德·衛斯里·漢明的名字命名。漢明碼在傳輸的消息流中插入驗證碼,當計算機存儲或移動數據時,可能會產生數據位錯誤,以偵測並更正單一比特錯誤。由於漢明編碼簡單,它們被廣泛應用於內存(RAM)。
在此介紹海明碼之前,先做倆道二年級智力題目。
問題一:我們有四個罐子,裏面分別裝有一些藥品,正版藥品重1g,盜版重0.9g,四罐中有一罐是盜版,我們有一臺天秤,問怎樣稱一次能辨別那個罐子是盜版。
想一下。
告訴你答案吧!我們取第一罐一顆藥,取第二罐倆顆藥,取第三罐三顆藥,取第四罐四顆藥。然後稱一下重量。
都是正品則重10g。如果差0.1g,那麼第一罐假的,如果差0.2g,那麼第二罐假的,如果差0.3g,那麼第三罐假的,如果差0.4g,那麼第四罐假的。問題解決了。
問題二:我們有四個罐子,裏面分別裝有一些藥品,正版藥品重1g,盜版重0.9g,不知道有幾罐是假的,我們有一臺天秤,問怎樣稱一次能辨別那些罐子是盜版。
想一下。
有了剛剛的提示,可能有人會說,依然那樣弄不行嗎?很明顯不行,如果差0.3g,那麼是第一罐和第二罐有問題還是第三罐有問題。敏銳的你應該注意到了,關鍵在取藥品的數量上。
我們取第一罐一顆藥(0001),取第二罐倆顆藥(0010),取第三罐四顆藥(0100),取第四罐八顆藥(1000)。然後稱一下重量。
重量差值(g) 盜版藥品
0.1(0001) 第一罐
0.2(0010) 第二罐
0.3(0011) 第一罐與第二罐
0.4(0100) 第三罐
0.5(0101) 第三罐與第一罐
。。。。 。。。。
1.5(1111) 第一罐 第二罐 第三罐 第四罐
正好巧妙的利用二進制的特點,表示出了所有差值情況和對應的盜版藥品(最關鍵一點:沒有出現“一對多”)
下面來正式介紹海明碼
相對於其它校驗碼,海明碼可以有多個校驗位,具有檢測並糾正一位錯誤代碼的糾錯碼,所以它也僅用於信道特性比較好的環境中,如以太局域網中,因爲如果信道特性不好的情況下,出現的錯誤通常不是一位。(官方說法)
一、計算原理:
1、計算校驗位數
2、確定校驗碼位置
3、確定校驗碼
4、實現校驗和糾錯
二、實例講解:
假如被校驗碼爲:01101001,求其偶校驗的海明碼?
1)計算校驗位數。被校驗的個數爲8位,8+k ≤ 2^k-1 k得到k爲4,所以需要添加4個校驗碼
2)確定校驗碼的位置。校驗碼只能放在第一位,第二位,第四位……(2的n次方位)。所以添加校驗碼後的總碼爲
0110d100c1ba
3)確定被校驗的各個位置。
a是第一位,所以根據規則校驗1位,然後跳過1位,再校驗1位,再跳過1位……最後校驗的各位(標紅),0110d100c1ba因爲是偶校驗,所以可以得到a爲1。
b是第二位,校驗2位,然後跳過2位,再連續校驗2位,再跳過2位……最後校驗的各位(標紅如下)0110d100c1ba,採用偶校驗,所以b可以得到結果爲0
c是第四位,校驗4位,然後跳過4位,再連續校驗4位,再跳過4位……最後校驗的各位(標紅如下)0110d100c1ba,採用偶校驗,所以c可以得到結果爲1
d是第八位,校驗8位,然後跳過8位,再連續校驗8位,再跳過8位……最後校驗的各位(標紅如下)
0110d100c1ba,採用偶校驗,所以可得d的結果爲0
4)所以01101001,其偶校驗的海明碼爲011001001101