計算機在運行程序過程中,存儲器、CPU、I/O設備不斷進行信息交換。由於結構、工藝、元器件等種種原因有時會使信息出錯。
具有指出錯誤、改正錯誤能力的編碼稱為糾錯碼,又稱校驗碼(Check Code)。
常用的校驗碼技術有:奇偶校驗碼,海明碼,循環冗余校驗碼,格雷碼等。
這里詳細介紹一下前三個
一、奇偶校驗碼:
1、解決的問題:奇偶校驗常用於內存儲器的校驗,例如IBM PC機內存。它能發現信息在寫入、傳送、讀出時的錯誤,但不能糾正錯誤。
2、原理:通過增加一位校驗位使得數據中所有位(包括校驗位)的1的個數保證為奇數(或偶數)這樣在收到數據的時候檢測(將所有的位異或起來)數據中1的個數是否仍然是奇數(或偶數)即可知道這個數據是否出錯
n位數據代碼的最低位后面加上一位校驗碼,組成了n+1位編碼。如果n+1位編碼的“1”的個數是奇數,則稱為奇校驗(Odd Parity);若是偶數,則稱為偶校驗(Even Parity)。統計“1”的個數常常用異或門電路來實現,
——偶校驗
——奇校驗
3、缺點:
這種方法只能發現奇數個代碼位出錯。因為偶數個出錯,校驗碼的奇偶性不發生變化。
這種方法也不能指出出錯代碼的位置。
奇偶校驗之所以被認為可靠,之所以大
量應用是基於數據代碼2位同時出錯的概率遠遠小於1位出錯的概率的緣故。
4、擴展:
交叉校驗:交叉校驗是二維奇偶校驗。當一次傳送一個具有n個字節的數據塊時,在每個字節設有一個水平奇偶校驗位,或稱行校驗位;在n個字節的同一位設有一個垂直校驗位,又稱列校驗位。當n=4時,如下所示
字節 |
數 據 位 |
奇校驗位(行) |
|||||||
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
||
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
2 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
3 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
4 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
奇校驗位(列) |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
這樣就可以通過兩個坐標找到並糾正一位錯了,但是仍然不能識別兩位錯。
二、海明碼
1、解決的問題:這是一種基於奇偶校驗的校驗方法,這樣可以防止校驗位在傳輸中出錯的問題
海明校驗碼是一種糾錯碼。這是由美國計算機科學家R.W.Hamming(海明)發明。海明由此獲得了1968年的圖靈獎。
2、原理:海明碼也是以奇偶校驗為基礎的,只是校驗位有多位。假設要傳送的數據信息是1位,用D表示。采用2個校驗位X1和X2,因而能表示4種情況,可以用其中一種表 示 無錯,其他三種表示出錯可能在D、X1和X2。方法是將D 和X1編成C1校驗組,D和X2編在C2校驗組。每一組形成一個奇偶校驗。
D |
X1 |
X2 |
|
C1 |
√ |
√ |
|
C2 |
√ |
√ |
如上表:假設數據位只有1位的時候添加兩位校驗位,
C2C1=0 0,可確定是D出錯。只要將D反相即可糾錯。
C2C1=0 1,X2出錯,無需糾正。
C2C1=1 0,X1出錯,無需糾正。
C2C1=1 1,沒有錯誤
海明碼實現:(這里只考慮1位錯)
a>要根據數據位的位數來確定使用幾位驗證位。假設有k個數據位,要加r個校驗位,那么要想驗證位的所有0/1組合可以表示所有的錯誤情況和一種全對情況,即滿足
k+r+1<=2^r
通過上式可以算出要加的驗證位個數,例如當數據是4位的時候要加3位驗證位(k==4,r==3)
b>設計驗證組:
I. 設計校驗碼放置的位置,第i個校驗碼放在第2^(i-1)位置上,以4位數據為例,那么3個驗證碼分別放在第1、2、4位的位置
II.設計校驗組:第i個校驗位每次開始選包括它自己的2^(i-1)個位,再間隔2^(i-1)位,然后再選2^(i-1)位,然后再間隔2^(i-1)位……直到選擇到串末尾
例如:數據是4位的時候對應的三組校驗組為:假設傳輸的7位為A1 A2 A3 A4 A5 A6 A7, 其中A1 A2 A4為校驗位
E1:A1,A3,A5,A7
E2:A2,A3,A6,A7
E3:A4,A5,A6,A7
c>確定是使用奇校驗還是偶校驗來填寫校驗位並傳輸,然后根據校驗位進行更正,下面以4位數據位來距離,試判定在奇校驗的前提下數據1101011串是否正確,如果不正確確定是哪一位出錯:
A1 | A2 | A3 | A4 | A5 | A6 | A7 | 是否有錯/有錯為1 | |
E1 | 1 | 0 | 0 | 1 | 1 | |||
E2 | 1 | 0 | 1 | 1 | 0 | |||
E3 | 1 | 0 | 1 | 1 | 0 |
注:因為是奇校驗而現在1的個數卻是偶數,所以第一組出錯了
可以看到第一組錯了,那么A1,A3,A5,A7有可能錯了,但是因為A3,A5,A7在E2和E3組中沒有出錯,所以就是A1出錯了,海明碼通過這樣的構造可以有神奇的結論,就是錯誤的位數就是E3,E2,E1構成的二進制數的值,比如這里是001,現在假設如果E3,E2,E1是101的話,可以看到是第一組和第三組錯了,這兩組共同的有A7,A5,但是第二組中的A7沒有錯,所以是A5錯了,正好是101表示的二進制數。
三、循環冗余碼
1、解決的問題:循環冗余校驗(Cyclic Redundancy Check)碼簡稱CRC碼。它適用於對一個數據塊進行校驗。常用來對磁表面存儲器進行校驗,也用於同步串行通信。磁表面存儲器的讀出錯誤主要是由於磁表面出現問題:划傷,灰塵,塗層不勻等。由於磁表面存儲器的位密度遠高於磁道密度,因此一個磁道上連續出錯的可能性要較幾道同時出錯的可能性大得多。這是連續集中出現的錯誤,稱作猝發性錯誤(Burst Error),和單個的隨機性出錯不同,因此提出循環冗余校驗。
2、原理:
I.循環冗余碼是基於模2運算的校驗碼,首先要說明模2運算。模2運算是以2為模的2進制加減乘除運算。以2為模說明運算不考慮進位和借位。模2運算以記號mod 2表示。模2運算的規則:
a>模2加法(用異或實現)
0+0=0 (mod 2)
0+1=1 (mod 2)
1+0=1 (mod 2)
1+1=0 (mod 2)
b>模2減法(用異或實現)
0 - 0=0 (mod 2)
0 - 1=1 (mod 2)
1 - 0=1 (mod 2)
1 - 1=0 (mod 2)
c>模2乘法
0×0=0 (mod 2)
0×1=0 (mod 2)
1×0=0 (mod 2)
1×1=1 (mod 2)
這里的加也要用模二加法
d>模2除法
它的運算規則是:(1)當被除數(或部分余數)的第1位是“1”,商取1,然后進行mod 2減法,減除數。若第1位是0,商取0,減去0。(所謂部分余數是在除法過程中所得的余數。)(2)當部分余數的位數比除數少一位,則部分余數就是最后的余數。
II.生成多項式G(x)
(1)任意一個2進制數都可用一個多項式表示。
11=1·2^1+1·2^0
101=1·2^2+1·2^0
1001=1·2^3+1·2^0
11011=1·2^4+1·2^3+ 1·2^1+1·2^0
因為CRC碼是M(x)[原數據]除以某個選定的多項式后產生的。當選用的多項式滿足:
(1)任何一位出錯時,余數不為0,
(2)不同位出錯使余數不同。
稱為生成多項式。生成多項式必須是質因式。
III.如何產生CRC碼
1)產生CRC校驗位的方法
① 設數據信息代碼M(x)是n位的2進制數。
② 將M(x)左移g位,因為生成多項式G(x)是g+1位。——余數一定比生成多項式少至少1位
③ M(x)除以G(x),用mod 2除法。
④ 除法完成后,得到的g位余數就是CRC校驗位。
2)CRC碼
將校驗位(余數)加到數據代碼M(x)的后面就構成了n+g位的CRC碼。
例 如果M(x)=1001,G(x)=1011。[G(x)是生成多項式] 試計算出校驗位,並組成CRC碼。
1)因為G(x)=4(位)所以g=3。將M(x)左移3位,移空位補0,得到1001000。
2)進行Mod 2除,1001000÷1011=1010,余數為110,即循環冗余校驗位。
3)把余數加到M(x)的后面,得到1001110,此即循環冗余碼。
在讀出校驗時,如果讀出校驗碼無誤,那么1001110÷1011,余數應為0。
VI.下面給出知道余數怎么找到哪一位出錯,以上面的生成 多項式G(x) = 1011為例,假設數據是A1 A2 A3 A4 A5 A6 A7
總結:當出錯時,例如1001110誤作1000110,此時1000110÷1011,余數不為0。當繼續進行Mod 2除法時余數將循環出現。因此被稱為循環冗余碼。下式中余數011將循環出現。可看出海明碼和循環冗余碼編碼原理相同,方法不同。循環碼在存儲和傳送過程中若是出現錯誤,則它除以原生成多項式后余數不等於零。出錯位和余數的對應關系,見表3.4。