在計算機的世界裡,所有資料都以二進位制的形式存在,而網際網路的出現讓計算機之間的溝通成為可能,它們彼此通過相互傳遞資料實現對話.那怎麼確保一台計算機向另一台計算機傳送的資料沒有因為網路波動造成資料跳變呢?因此為了確保每台計算機接受到的資料都是準確無誤的,我們需要創造一種校驗機制以保證傳輸資料的正確性.
現在假設計算機a有乙個任務,它需要向計算機b傳輸一條二進位制資料1010.為了確保b接受到的資料沒有發生跳變,a就和b約定:"我呢需要在所有的原始資料(當前是1010)前面加乙個數字(也就是校驗位),加上去以後保證整條資料1的個數為偶數再發給你,你接受到以後看一下整條資料1的個數是不是偶數,如果不是就說明資料發生了跳變."
上述a新增的的校驗位使1的個數為偶數稱為偶校驗.如果雙方約定要使1的個數為奇數才算正確就稱為奇校驗.奇偶校驗屬於兩種校驗方式,但是它們的缺點也很明顯.第一只能校驗出一位資料發生跳變.比如上面的案例01010傳輸過程中右邊兩位發生跳變01001,1的個數照樣構成了偶數,所以b接受到資料也無法判端其正確性.其次奇偶校驗只能判端對錯,不能指出哪一位資料發生了錯誤.
海明碼是基於奇偶校驗的基礎上創造的一種更加先進的校驗方式,它不僅能判端資料是否出錯,而且還能指出整條資料中哪一位出了錯.它的缺陷是只能校驗出一位資料發生跳變,如果多位資料變化它就檢測不出來了.但是在現實世界當中,資料發生跳變很大很大的概率是只有一位發生變化,因此海明碼也擁有相應的應用場景.
假設a有一條資料1010,它需要傳送給b,但是為了能糾錯,它引入了三個校驗位a,b,c.並以下面的形式擺放:
1 0 1 c 0 b a
7 6 5 4 3 2 1
為什麼要引入三個校驗位以及按照這樣的順序來擺放後面會講述,接著在每個資料下面標識相應的序號.
異或運算是什麼呢?兩個二進位制數進行異或運算相同為0,相異為1.(比如 1 異或 1 = 0 ,1 異或 0 = 1).⊕為異或運算子.
通過上面一整個流程走下來發現,資料糾錯的核心是新增了3個校驗位,並依據這三個校驗位對資料進行了分組.通過不同組間的關聯,一旦發現某乙個組或多個組同時出錯時可以迅速的推斷出哪個組中的哪一位資料出現了錯誤.如此便達到了糾錯的目的.那麼如何判端應該新增幾個校驗位,以及怎麼按校驗位來進行資料分組就成為了接下來的關鍵.
使用者a需要向使用者b傳送一條原始資料 1 0 1 0.那怎麼根據原始資料的位數計算出校驗位的位數呢?
假設原始資料有n位,校驗資料有k位,那麼校驗位能夠表示2^k種情況.我們傳遞給b的資料等於n + k位,在最多只有一位跳變的前提下,n + k位的資料出錯的情況就有n + k種,資料完全正確的情況算一種.那麼 2^k 就要能表示出所有的情況才行,因此可以推出下面不等式:
2^k >= n+k+1
現在原始資料n = 4,根據上面不等式不難推出k = 3.那麼就設定三位校驗位 k3 k2 k1組合到原始資料當中去.那這三個校驗位怎麼擺放呢?我們可以先從數字中發現乙個規律2^0 = 001,2^1 = 010, 2^2 = 100,2^3 = 1000.2的0次方只有第一位為1,一次方只有第二位為1,2次方只有第三位為1.我現在想讓k1負責所有原始資料序號第一位為1的分組,k2負責所有原始資料序號第二位為1的分組.那麼就讓k1的序號 = 2^0 = 1,k2的序號 = 2^1 = 2 ,k3的序號 = 2^2 = 4.(假設有kn,kn的序號等於2^n-1)
按照上面的計算就可以將資料排列如下(並標出序號):
1 0 1 k3 0 k2 k1
7 6 5 4 3 2 1
1. 按照上面的描述現在對資料進行分組:
k1負責原始資料序號第一位為1的資料.比如3號011,5號101,7號111,它們的第一位都為1.分組情況如下:
k1 -- 3 5 7
k2 -- 3 6 7
k3 -- 5 6 7
2. 組分好了現在計算k1,k2和k3的值
k1 = 3號 ⊕ 5號 ⊕ 7號 = 0 ⊕ 1 ⊕ 1 = 0
k2 = 3號 ⊕ 6號 ⊕ 7號 = 0 ⊕ 0 ⊕ 1 = 1
k3 = 5號 ⊕ 6號 ⊕ 7號 = 1 ⊕ 0 ⊕ 1 = 0
3. 那麼最終得到的資料為1 0 1 0 0 1 0,a將此條資料就發給了b
4. b接收到了資料,它也根據2^k >= n+k+1這條公式計算出k = 3,並根據a的計算規則知道k1,k2,k3分別處於哪個位置,隨後就推出了k1 = 0,k2 = 1,k3 = 0.
5. 現在b開始校驗資料了.他開始做下面的三組運算.
k1 ⊕ 3號 ⊕ 5號 ⊕ 7號 = 0 ⊕ 0 ⊕ 1 ⊕ 1 = 0
k2 ⊕ 3號 ⊕ 6號 ⊕ 7號 = 1 ⊕ 0 ⊕ 0 ⊕ 1 = 0
k3 ⊕ 5號 ⊕ 6號 ⊕ 7號 = 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0
按照正常沒出錯的情況來講,三組計算後的結果都為0才正確.假如第一組計算結果為1,那麼第二組和第三組的3號,5號,6號,7號以及k2和k3都沒出錯,從而可以推出k1發生了跳變.假如第一組和第二組計算結果同時為1,那麼可以推斷出k3,5號,6號,7號沒有出錯,第一組和第二組的交集是3號和7號,而7號又沒問題,只可能是3號發生了跳變.
當然還有更簡單的判端方式.假如第一組和第二組計算結果同時為1,那麼從下往上將三個組的結果組合在一起就是011,結果等於3,表示3號資料出錯了.如此檢查和糾錯功就全部實現了.
資料校驗 奇偶校驗 海明碼
2.海明碼 2 實現 計算機中的資料都是用0 1表示的,在物理層面,就是高電平和低電平,這就存在資料出錯的可能性。首先講資料進行分組,比如8位是一組,每一組對應乙個校驗碼位。如果8位資料有奇數個1,那麼校驗碼位就是1,如果8位資料位有偶數個1,那麼校驗碼位就是0。第一,如果是兩位資料位同時發生錯誤,...
海明碼校驗原理
海明校驗的基本思想 將有效資訊按某種規律分成若干組,每組安排乙個校驗位,做奇偶測試,就能提供多位檢錯資訊,以指出最大可能是哪位出錯,從而將其糾正。實質上,海明校驗是一種多重校驗。海明校驗的特點 它不僅具有檢測錯誤的能力,同時還具有給出錯誤所在準確位置的能力。一 校驗位的位數 校驗位的位數與有效資訊的...
海明碼校驗程式設計
海明碼校驗程式設計 1 海明碼編碼 輸入 一串二進位制資料串 輸出 插入海明碼後的二進位制資料串 2 海明碼糾錯 輸入 一串含海明碼的二進位制資料串 輸出 通過海明碼校驗,檢查該二進位制串是否有錯,若有錯誤,則對錯誤位進行糾錯,將糾錯後的二進位制串輸出。這裡我們僅從程式設計實現的角度分析海明碼的編碼...