計算機系統運行時,各個部之間要進行數據交換.交換的過程中,會有發生誤碼的可能(即0變成1或1變成0),由於計算機的儲存是通過二進制代碼來實現的的,誤碼會導致儲存的內容發生改變。為確保數據在傳送過程正確無誤,常使用檢驗碼. 我們常使用的檢驗碼有三種. 分別是奇偶校驗碼、海明校驗碼和循環冗余校驗碼(CRC) 。
一、奇偶校驗碼
學習資料:常用校驗碼
概念:
奇偶校驗碼是奇校驗碼和偶校驗碼的統稱. 它們都是通過在要校驗的編碼上加一位校驗位組成.
校驗方法:
如果是奇校驗加上校驗位后,編碼中1的個數為奇數個。如果是偶校驗加上校驗位后,編碼中1的個數為偶數個。
分類:
- 水平奇偶校驗碼:對每一個數據的編碼添加校驗位,使信息位與校驗位處於同一行
例子:
原編碼 | 奇校驗 | 偶校驗 |
---|---|---|
0000 | 0000 1 | 0000 0 |
0010 | 0010 0 | 0010 1 |
1100 | 1100 1 | 1100 0 |
1010 | 1010 1 | 1010 0 |
當原編碼在傳輸、儲存的過程中發生了誤碼,1的數量就會改變,然后就能校驗出該過程出現了錯誤。
- 垂直奇偶校驗碼:把數據分成若干組,一組數據排成一行,再加一行校驗碼. 針對每一行列采用奇校驗 或 偶校驗
缺點:
- 只能檢測出奇數位出錯. 如果發生偶數位錯誤就無法檢測
設原編碼為0000,傳輸的過程中變成了1001。如果使用奇校驗,原編碼是00001,傳輸過后會變成10011,1仍然是奇數個,無法校驗;如果使用偶校驗,原編碼是00000,傳輸過后會變成10010,1仍然是偶數個,同樣無法校驗。
- 奇偶校驗碼無法檢測出哪位出錯.所以屬於無法矯正錯誤的校驗碼。
校驗過程中只知道1的數量發生變化,對於哪個地方發生變化無從知道。
二、海明校驗碼
學習資料:海明校驗碼
實現原理:
它的實現原理,是在m個數據位之外加上k個校驗位,從而形成一個m+k位的新的碼字,使新的碼字的碼距比較均勻地拉大。把數據的每一個二進制位分配在幾個不同的偶校驗位的組合中,當某一位出錯后,就會引起相關的幾個校驗位的值發生變化,這不但可以發現出錯,還能指出是哪一位出錯,為進一步自動糾錯提供了依據。
兩個碼組對應位上數字的不同位的個數稱為碼組的距離,簡稱碼距
例:
1 | 0 | 1 | 0 | 1 |
---|
0 | 0 | 0 | 0 | 1 |
---|
這兩個二進制碼中,有三個不相同的位置,所以碼距為3.
須知:
- 海明校驗碼是放在2的冪次位上的,即“1,2,4,8,16,32······”;
- 信息位為m的原始數據,需要加入k位的校驗碼,它滿足m+k+1<2^k;
例子:
要計算原始信息位為101101100的海明校驗碼。
先用m+k+1<2^k計算出校驗位:9+k+1 <2^k→k=4,即校驗位為4位。
因為海明校驗碼是放在2的冪次位上,所以插在位置1,2,4,8中
用到的校驗碼是看 當前位置由哪幾個 校驗碼所在的位置的和
- 例如
校驗碼的位置是1,2,4,8。位置3= 1 + 2,所以位置3用到的校驗碼是1和2;位置7 = 1 + 2 + 4組成的,所以位置7用到的校驗碼是1,2和4。
然后將校驗碼校驗的位置記錄下來:
- 校驗碼1(位置1):3,5,7,9,11,13
- 校驗碼2(位置2):3,6,7,10,11
- 校驗碼3(位置4):5,6,7,12,13
- 校驗碼4(位置8):9,10,11,12,13
注意:后面的數字串是位置的下標,不是值,值還是0或1。
然后做異或運算(相同時為0,不同時為1)
- 校驗碼1(位置1):1 xor 0 xor 1 xor 0 xor 1 xor 0 = 1
- 校驗碼2(位置2):1 xor 1 xor 1 xor 1 xor 1 = 1
- 校驗碼3(位置4):0 xor 1 xor 1 xor 0 xor 0 = 0
- 校驗碼4(位置8):0 xor 1 xor 1 xor 0 xor 0 = 0
三、循環冗余校驗碼(CRC校驗)
學習資料:CRC的校驗原理以及例子
原理:CRC檢驗原理實際上就是在一個p位二進制數據序列之后附加一個r位二進制檢驗碼(序列),從而構成一個總長為n=p+r位的二進制序列;附加在數據序列之后的這個檢驗碼與數據序列的內容之間存在着某種特定的關系。如果因干擾等原因使數據序列中的某一位或某些位發生錯誤,這種特定關系就會被破壞。
實現步驟:
雙方事先約定了一個R次多項式g(x),即CRC碼
CRC碼的特點:
- 位數要少於原編碼
- 收尾為1
- 自行決定
例:
原編碼:1001001011
則CRC碼可以為10011,也可以為11001等
但是:10010這種不可以,因為它的尾巴不是1,1001101011也不行,因為它的位數與原編碼的一致。
要注意的是:CRC碼並非是校驗碼,但需要通過CRC碼來獲得校驗碼。具體校驗碼的話要先讓原編碼加上CRC碼位數個0(即CRC碼有的多少位,就要加上多少位0在原編碼的后面)然后用新原編碼除CRC碼,得到的余數就是校驗碼
例:
原編碼=1010001101
CRC碼設為:110101
校驗碼有5位,因此
新原編碼:101000110100000
然后用新原編碼除以CRC碼:
校驗碼就是01110
校驗方法
用原編碼與校驗碼進行模2減法,獲得最終原編碼。此時最終原編碼除以CRC碼是可以整除的,由於接收方也有相同的CRC碼,在數據傳輸的過程中不發生錯誤,接收方用接收到的數據除以CRC碼也是可以整除的,此時為無錯誤。同時,不能整除,說明傳輸過程中數據發生了錯誤。