1. 程式人生 > >crc校驗詳解

crc校驗詳解

一、crc校驗是什麼?

  CRC即迴圈冗餘校驗碼(Cyclic Redundancy Check[1] ):是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊欄位和校驗欄位的長度可以任意選定。迴圈冗餘檢查(CRC)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。

二、crc的原理是什麼?

  迴圈冗餘校驗碼(CRC)的基本原理是:在K位資訊碼後再拼接R位的校驗碼,整個編碼長度為N位,因此,這種編碼也叫(N,K)碼。對於一個給定的(N,K)碼,可以證明存在一個最高次冪為N-K=R的多項式G(x)。根據G(x)可以生成K位資訊的校驗碼,而G(x)叫做這個CRC碼的生成多項式。 校驗碼的具體生成過程為:假設要傳送的資訊用多項式C(X)表示,將C(x)左移R位(可表示成C(x)*2R),這樣C(x)的右邊就會空出R位,這就是校驗碼的位置。用 C(x)*2R 除以生成多項式G(x)得到的餘數就是校驗碼。
  任意一個由二進位制位串組成的程式碼都可以和一個係數僅為‘0’和‘1’取值的多項式一一對應。例如:程式碼1010111對應的多項式為x6+x4+x2+x+1,而多項式為x5+x3+x2+x+1對應的程式碼101111。

三、基本概念

對應關係

  多項式和二進位制數有直接對應關係:X的最高冪次對應二進位制數的最高位,以下各位對應多項式的各冪次,有此冪次項對應1,無此冪次項對應0。可以看出:X的最高冪次為R,轉換成對應的二進位制數有R+1位。
多項式包括生成多項式G(X)和資訊多項式C(X)。
  如生成多項式為G(X)=X4+X3+X+1, 可轉換為二進位制數碼11011。
而傳送資訊位 101111,可轉換為資料多項式為C(X)=X5+X3+X2+X+1。
生成多項式是接受方和傳送方的一個約定,也就是一個二進位制數,在整個傳輸過程中,這個數始終保持不變。
  在傳送方,利用生成多項式對資訊多項式做模2除生成校驗碼。在接收方利用生成多項式對收到的編碼多項式做模2除檢測和確定錯誤位置。
應滿足以下條件:
  A、生成多項式的最高位和最低位必須為1。
  B、當被傳送資訊(CRC碼)任何一位發生錯誤時,被生成多項式做除後應該使餘數不為0。
  C、不同位發生錯誤時,應該使餘數不同。
  D、對餘數繼續做除,應使餘數迴圈。
校驗碼位數
  CRC校驗碼位數 = 生成多項式位數 - 1。注意有些生成多項式的簡記式中將生成多項式的最高位1省略了。

生成步驟

  1、將X的最高次冪為R的生成多項式G(X)轉換成對應的R+1位二進位制數。
  2、將資訊碼左移R位,相當於對應的資訊多項式C(X)*2R。
  3、用生成多項式(二進位制數)對資訊碼做除,得到R位的餘數(注意:這裡的二進位制做除法得到的餘數其實是模2除法得到的餘數,並不等於其對應十進位制數做除法得到的餘數。)。
  4、將餘數拼到資訊碼左移後空出的位置,得到完整的CRC碼。

四、例子:

【例】假設使用的生成多項式是G(X)=X3+X+1。4位的原始報文為1010,求編碼後的報文。
解:
  1、將生成多項式G(X)=X3+X+1轉換成對應的二進位制除數1011。
  2、此題生成多項式有4位(R+1)(注意:4位的生成多項式計算所得的校驗碼為3位,R為校驗碼位數),要把原始報文C(X)左移3(R)位變成1010 000
  3、用生成多項式對應的二進位制數對左移3位後的原始報文進行模2除(高位對齊),相當於按位異或:

1010000
1011
------------------
   1000
   1011
------------------
    011

得到的餘位011,所以最終編碼為:1010 011
  【說明】“模2除法”與“算術除法”類似,但它既不向上位借位,也不比較除數和被除數的相同位數值的大小,只要以相同位數進行相除即可。模2加法運算為:1+1=0,0+1=1,0+0=0,無進位,也無借位;模2減法運算為:1-1=0,0-1=1,1-0=1,0-0=0,也無進位,無借位。相當於二進位制中的邏輯異或運算。也就是比較後,兩者對應位相同則結果為“0”,不同則結果為“1”。如100101除以1110,結果得到商為11,餘數為1,如圖5-9左圖所示。如11×11=101,如圖5-9右圖所示。
這裡寫圖片描述

五、擴充套件學習:奇偶校驗

1.奇偶校驗是什麼?

  奇偶校驗(Parity Check)是一種校驗程式碼傳輸正確性的方法。根據被傳輸的一組二進位制程式碼的數位中“1”的個數是奇數或偶數來進行校驗。採用奇數的稱為奇校驗,反之,稱為偶校驗。採用何種校驗是事先規定好的。通常專門設定一個奇偶校驗位,用它使這組程式碼中“1”的個數為奇數或偶數。若用奇校驗,則當接收端收到這組程式碼時,校驗“1”的個數是否為奇數,從而確定傳輸程式碼的正確性。

2.奇偶校驗的工作方式:

  為了能檢測和糾正記憶體軟錯誤,首先出現的是記憶體“奇偶校驗”。記憶體中最小的單位是位元,也稱為“位”,位只有兩種狀態分別以1和0來標示,每8個連續的位元叫做一個位元組(byte)。不帶奇偶校驗的記憶體每個位元組只有8位,如果其某一位儲存了錯誤的值,就會導致其儲存的相應資料發生變化,進而導致應用程式發生錯誤。而奇偶校驗就是在每一位元組(8位)之外又增加了一位作為錯誤檢測位。在某位元組中儲存資料之後,在其8個位上儲存的資料是固定的,因為位只能有兩種狀態1或0,假設儲存的資料用位標示為1、1、1、0、0、1、0、1,那麼把每個位相加(1+1+1+0+0+1+0+1=5),結果是奇數。對於偶校驗,校驗位就定義為1,反之則為0;對於奇校驗,則相反。當CPU讀取儲存的資料時,它會再次把前8位中儲存的資料相加,計算結果是否與校驗位相一致。從而一定程度上能檢測出記憶體錯誤,奇偶校驗只能檢測出錯誤而無法對其進行修正,同時雖然雙位同時發生錯誤的概率相當低,但奇偶校驗卻無法檢測出雙位錯誤。

優缺點:

  奇偶校驗有兩種型別:奇校驗和偶校驗。奇偶校驗位是一個表示給定位數的二進位制數中1的個數是奇數或者偶數的二進位制數,奇偶校驗位是最簡單的錯誤檢測碼。如果傳輸過程中包括校驗位在內的奇數個數據位發生改變,那麼奇偶校驗位將出錯表示傳輸過程有錯誤發生。因此,奇偶校驗位是一種錯誤檢測碼,但是由於沒有辦法確定哪一位出錯,所以它不能進行錯誤校正。發生錯誤時必須扔掉全部的資料,然後從頭開始傳輸資料。在噪聲很多的媒介上成功傳輸資料可能要花費很長的時間,甚至根本無法實現。但是奇偶校驗位也有它的優點,它是使用一位資料能夠達到的最好的校驗碼,並且它僅僅需要一些異或門就能夠生成。奇偶校驗被廣泛應用。