1. 程式人生 > >計算機校驗碼分類及原理

計算機校驗碼分類及原理

由於元件故障和噪聲干擾等因素常常導致計算機在處理資訊的過程中出現錯誤。為了防止資訊在傳輸過程的錯誤,將訊號採用專門的邏輯電路進行編碼以檢測錯誤,甚至校正錯誤。

通常的方法是在每個字上新增一些校驗位,用來確定字中出現錯誤的位置。

   在計算機中有三種常見的檢驗碼,分別是:奇偶校驗碼,海明校驗碼,迴圈冗餘碼

<1>奇偶校驗碼

     這是最簡單的校驗方式,在資訊編碼的時候,將字的最高位作為校驗位。需要說明的事奇偶校驗也有兩種校驗方式:奇校驗和偶校驗。

奇校驗:在最高位新增0或1,使字編碼中的“1”的個數為奇數。

偶校驗:在最高位新增0或1,使字編碼中的“1”的個數為偶數。

    校驗特點:一次能校驗更多的資料,效率較高,系統實現也比較簡單,檢測可靠性有所提高,但仍然不能檢測出所有的錯誤。

<2> 海明校驗碼

     海明校驗是一種多重校驗, 將有效資訊按某種規律分成若干組,每組安排一個校驗位,做奇偶測試,就能提供多位檢錯資訊,以指出最大可能是哪位出錯。假設k個數據位設定r個校驗位,則應滿足:

            ^r>=k+r+1

     校驗位分佈2^0,2^1,2^2...2^n位上,如下所示(以4位資料位為例):

  

校驗的位置為:


由此可以看出,校驗位置的資料分別校驗:


接下來採用異或運算得出具體的R的值:

R1=1,R2=0,R3=0;

再將值分別填入資訊位即可。

<3>迴圈冗餘碼

     奇偶校驗碼作為一種檢錯碼雖然簡單,但是漏檢率太高。在計算機網路和資料通訊中用E得最廣泛的檢錯碼,是一種漏檢率低得多也便於實現的迴圈冗餘碼CRC (Cyclic Redundancy .Code),CRC碼又稱為多項式碼。

    任何一個由二進位制數位串組成的程式碼,都可以惟一地與一個只含有0和1兩個係數的多項式建立一一對應的關係。例如,程式碼1010111對應的多項式為X6+X4+X2+X+1,同樣.多項式X5+X3+X2+X+1對應的程式碼為101111。

    CRC碼在傳送端編碼和接收端校驗時,都可以利用事先約定的生成多項式G(X)來得到。 k位要傳送的資訊位可對應於一個(k-1)次多項式K(X),r位冗餘位則對應於一個(r-1)次多項式R(X),由k位資訊位後面加上r位冗餘位組成的 n=k+r位碼字則對應於一個(n-1)次多項式T(X)=Xr·K(X)+R(X)。例如

    資訊位:1011001→K(X)=X6+X4+X3+1

    冗餘位:1010→R(X)=X3+X

    碼字:10110011010→T(X)=X4·K(X)+R(X)

    =X10+X8+X7+X4+X3+X

    由資訊位產生冗餘位的編碼過程,就是已知K(X)求R(X)的過程。在CRC碼中可以通過找到一個特定的r次多項式G (X)(其最高項Xr的係數恆為1),然後用Xr·K (X)去除以G(X),得到的餘式就是R(X)。特別要強調的是,這些多項式中的"+"都是模2加(也即異或運算);此外,這裡的除法用的也是模2除法, 即除法過程中用到的減法是模2減法,它和模2加法的運算規則一樣,都是異或運算,這是一種不考慮加法進位和減法借位的運算,即

    0+O=0,0+1=1,1+0=1,1+1=0

    0-0=0,0-1=1,1-0=1,1-1=0

    在進行基於模2運算的多項式除法時,只要部分餘數首位為1,便可上商1,否則上商0。然後按模2減法求得餘數,該餘數不計最高位。當被除數逐位除完時,最後得到比除數少一位的餘數。此餘數即為冗餘位,將其新增在資訊位後便構成CRC碼字。

    仍以上例中K(X)=X6+X4+X3+1為例(即資訊位為1011001),若G(X)=X4+X3+1

(對應程式碼11001),取r=4,則X4·K(X)=X10+X8+X7+X4(對應程式碼為0110010000),其由模2除法求餘式R(X)的過程所示如下:

    得到的最後餘數為1010,這就是冗餘位,對應R(X)=X3+X。

    由於R(X)是Xr·K(X)除以G(X)的餘式,那麼下列關係式必然滿足

    Xr·K(X)=G(X)Q(X)+R(X)

    其中Q(X)為商式。根據模二運算規則R(X)+R(X)=0的特點,可將上式改記為

    [Xr-K(X)+R(X)]/G(X)=Q(X)

    即    T(X)/G(X)=Q(X)

    由此可見,通道上傳送的碼字多項式T(X)=Xr-K(X)+R(X)。若傳輸過程無錯,則接收方收到的碼字也對應於此多項式,也即接收到的碼字多項式能被G(X)整除。因而接收端的校驗過程就是將接收到的碼字多項式除以G(X)的過程。若餘式為零則認為傳輸元差錯;若餘式不為零則傳輸有差錯。

    例如,前述例子中若碼字10110011010經傳輸後由於受噪聲的干擾,在接收端變成為10110011100,則求餘式的除法如下:

求得的餘式不為零,相當於在碼字上面半加上了差錯模式00000000110。差錯模式對應的多項式記為E(X),上例中E(X)=X2+X。有差錯時,接收端收到的不再是T(X),而是T(X)與E(X)之模二加,即

    [T(X)+E(X)]/G(X)=T(X)/G(X)+E(X)/G(X)

若E(X)/G(X)=0,則這種差錯就能檢測出來;若E(X)/G(X)=0,那麼由於接收到的碼字多項式仍然可被G(X)整除,錯誤就檢測不出來,也即發生了漏檢。

    理論上可以證明迴圈冗餘校驗碼的檢錯能力有以下特點:

    (1)可檢測出所有奇數位錯。

    (2)可檢測出所有雙位元的錯。

    (3)可檢測出所有小於、等於校驗位長度的突發錯。

    CRC碼是由r-K(X)除以某個選定的多項式後產生的,所以該多現式稱生成多項式。一般來說,生成多項式位數越多校驗能力越強。但並不是任何一個r+1位的二進位制數都可以做生成多項式。目前廣泛使用的生成多項式主要有以下四種:

    (1)CRC12=X12+X11+X3+X2+1

    (2)CRC16=X16+X15+X2+1(IBM公司)

    (3)CRC16=X16+X12+X5+1(CCITT)

    (4)CRC32=X32+X26+X23+X22+X16+X11+X10+X8+X7+X5+X4+X2+X+1