常用校驗碼(奇偶校驗,海明校驗,CRC)學習總結
常用校驗碼(奇偶校驗,海明校驗,CRC)學習總結
一.為什麽要有校驗碼?
因為在數據存取和傳送的過程中,由於元器件或者噪音的幹擾等原因會出現錯誤,這個時候我們就需要采取相應的措施,發現並糾正錯誤,對於錯誤的檢測和校正,大多采取“冗余校驗”的思想,即除原數據外,額外增加若幹位編碼,這些新增的代碼稱為校驗位。
二.數據是如何校驗的?
- 輸入的數據m經過f得到p校驗位。
- 數據m和校驗位一起通過存儲器或傳輸線路,分別得到m‘和p‘,這兩者可能和m,f相同,也可能由於傳輸儲存發生問題而不同。
- 由數據m‘再次經過f得到校驗位p‘‘,比較p‘‘和p‘,從而得出是否出錯,輸出對應的信息,如何比較,會在下面的對應校驗碼中給出。
三.碼距
若幹位代碼組成的一個字稱為碼字,而兩個碼字具有不同代碼的位數為這兩個碼字的距離,而碼制裏各種碼字間最小的距離稱為碼距。
比如8421碼,1001和0000,有兩位不同,所以距離是2,而0010和0011的距離為1,是最小的距離,故8421碼碼距為1
那麽,碼距有什麽用呢?答案是碼距和這種類型的碼的檢錯,糾錯能力有關。
如8421碼,由於碼距是1,無檢錯,糾錯能力,比如數據0000,如果其中一位變化,變成0001,那麽,這個數據仍然是合法的。
再如奇偶校驗碼中奇校驗碼,如100000000和010000000,碼距為2,我們可以發現,如果數據中有一位變化了,如100000000變為110000000,我們可以很容易地判斷出數據出錯了,因為110000000不符合奇校驗的編碼(校驗位和數據位一起所含1的個數為奇數)
我們可以發現,校驗碼可以幫助擴大碼距,從而找出錯誤。
碼距與檢錯、糾錯能力的關系(當d≤4)
- 若碼距d為奇數,則能發現d-1位錯,或能糾正(d-1)/2位錯。
- 若碼距d為偶數,則能發現d/2位錯,並能糾正(d/2-1)位錯。
四.奇偶校驗碼
1.編碼方式
- 無論數據位多少位,校驗位只有一位
- 數據位和校驗位一共所含的1個數為奇數,稱為奇校驗
- 數據位和校驗位一共所含的1個數為偶數,稱為偶校驗
例如(加粗為校驗位):
數據 | 奇校驗的編碼 | 偶校驗的編碼 |
---|---|---|
00000000 | 100000000 | 000000000 |
01010100 | 001010100 | 101010100 |
01111111 | 001111111 | 101111111 |
由於數據傳輸過程一般是出現一位錯誤,而奇偶校驗碼能發現奇數個錯誤,所以奇偶校驗的實用價值還是很高的。
2.實現原理
那麽,奇偶校驗是怎麽來發現錯誤的呢?根據二.數據是如何校驗的我們可以知道,在數據傳輸之前,我們會求一次校驗位,傳輸後,會求一次校驗位,那麽,在奇偶校驗中,我們通過比較這兩個校驗位是否相同,一般是采用異或的方式,若結果為1,則說明有奇數個錯誤,結果為0,則說明正確或者偶數個錯誤。
五.海明校驗碼
1.引入
- 在了解了奇偶校驗碼之後,我們可以稍稍做下思考,既然奇偶校驗碼具有一定的局限性,也就是只能檢測奇數的錯誤,並且不能改正錯誤,這也就意味著數據一旦傳輸錯誤,我們必須要重新上傳,那麽,我們有辦法確定錯誤發生的位置麽?只要確定了錯誤發生的位置,改正其實就是取反。
- 這個時候,讓我們來看看奇偶校驗碼,它是在數據的前面或者後面加上以為校驗位,那麽,如果我們將數據分段,分成某些小段,這樣是不是能判斷錯誤發生的位置呢?
2.海明校驗碼 最簡單求法
我們以8位數據位,4(5)位校驗位為例
我們將海明校驗碼表示為(H13) H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
其中加粗的部分為校驗位,校驗位所在位置為2^(i-1),i=1,2,3...
我們還可以把它寫成(P5) D8 D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P1
其中P代表的是校驗位,D代表數據位
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | S | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2^0 | D7 | D5 | D4 | D2 | D1 | P1 | S1 | ||||||
2^1 | D7 | D6 | D4 | D3 | D1 | P2 | S2 | ||||||
2^2 | D8 | D4 | D3 | D2 | P3 | S3 | |||||||
2^3 | D8 | D7 | D6 | D5 | P4 | S4 |
我們來看看這個表是怎麽畫出來的
- 首先數據位和校驗位的位置我們通過公式可以得出
- 同列數據位所占的位置對應的行的值之和為列的值。舉個例子,如D1,所在列為3,所在行分別為2^0和2^1,即1和2,滿足式子1+2=3。
校驗位的值為同行數據位相異或得到,至於P5,則是由所有數據位和校驗位一起異或得到。
3.海明校驗碼判斷修復錯誤
下面引入一個錯誤字S的概念
其實錯誤字S也就是傳輸前後分別求的校驗位的異或值,奇偶校驗碼只要看一個錯誤字,而海明校驗碼則要考慮多個錯誤字。
S4 ~ S1為全0,說明沒錯. S4 ~ S1不為全0,說明有錯. S5=1說明1位出錯,而S5=0說明2位錯,不再有效,且不能查出是哪2位出錯。
S4~S1的編碼值對應的則是出錯的海明碼位號(不太清楚圖表可以返回上面的表格對照):
如1100,對應D8出錯
如1011,對應D7出錯
如1010,對應D6出錯
如1001,對應D5出錯......
- Tip:我們通過觀察8個數據位4個校驗位的海明校驗碼,發現,若一位出錯,則至少有兩組校驗碼的生成收到影響,故我們得到其碼距為3,根據碼距與檢錯、糾錯能力的關系可以得出該校驗碼能發現兩位錯,或修改一位錯。
4.校驗碼位數的確定
前面看完後,一定有人會有疑問,為什麽八位數據位我要四位或者五位校驗位,三位不行麽?六位不行麽?那麽,請繼續看看下面
假定數據位數為n,校驗碼為k位,則故障字位數也為k位。k位故障字所能表示的狀態最多是2K,每種狀態可用來說明一種出錯情況。
若只有一位錯,則結果可能是:
數據中某一位錯 (n種可能)
校驗碼中有一位錯 (k種可能)
無錯 ( 1 種可能)
假定最多有一位錯,則n和k必須滿足下列關系:
2^k≥1+n+k, 即:2^k-1≥n+k
所以當數據有8位時,校驗碼和故障字都應有至少4位。
六.循環冗余碼(CRC碼)
1.為什麽大批量數據不用奇偶校驗?
在每個字符後增加一位校驗位會增加大量的額外開銷;尤其在網絡通信中,對傳輸的二進制比特流沒有必要再分解成一個個字符,因而無法采用奇偶校驗碼。
2.模2運算
在介紹CRC碼之前,有必要介紹下計算CRC碼必要的模2運算:
模2運算不考慮加法進位和減法借位,上商的原則是當部分余數首位是1時商取1,反之商取0。然後按模2相減原則求得最高位後面幾位的余數。這樣當被除數逐步除完時,最後的余數位數比除數少一位。這樣得到的余數就是校驗位。
3.基本思想
- 數據信息M(x)為一個n位的二進制數據,將M(x)左移k位後,用一個約定的“生成多項式”G(x)相除,G(x)是一個k+1位的二進制數,相除後得到的k位余數就是校驗位。校驗位拼接到M(x)後,形成一個n+k位的代碼,稱該代碼為循環冗余校驗 ( CRC ) 碼,也稱(n+k,n)碼。
- 一個CRC碼一定能被生成多項式整除,當數據和校驗位一起送到接受端後,只要將接受到的數據和校驗位用同樣的生成多項式相除,如果正好除盡,表明沒有發生錯誤;若除不盡,則表明某些數據位發生了錯誤。通常要求重傳一次。
4.CRC碼求法
5.CRC碼檢錯
將收到的CRC碼用約定的生成多項式G(x)去除,如果碼字無誤則余數應位0,如果有某一位出錯,則余數不為0,不同位數出錯余數不同.
常用校驗碼(奇偶校驗,海明校驗,CRC)學習總結