CRC校驗碼

CRC校驗碼的編碼方法是用待發送的二進制數據t(x)除以生成多項式g(x),將最後的餘數作爲CRC校驗碼。其實現步驟如下:
(1) 設待發送的數據塊是m位的二進制多項式t(x),生成多項式爲r階的g(x)。在數據塊的末尾添加r個0,數據塊的長度增加到m+r位,對應的二進制多項式爲 。
(2) 用生成多項式g(x)去除 ,求得餘數爲階數爲r-1的二進制多項式y(x)。此二進制多項式y(x)就是t(x)經過生成多項式g(x)編碼的CRC校驗碼。
(3) 用 以模2的方式減去y(x),得到二進制多項式 。 就是包含了CRC校驗碼的待發送字符串。
從CRC的編碼規則可以看出,CRC編碼實際上是將代發送的m位二進制多項式t(x)轉換成了可以被g(x)除盡的m+r位二進制多項式 ,所以解碼時可以用接受到的數據去除g(x),如果餘數位零,則表示傳輸過程沒有錯誤;如果餘數不爲零,則在傳輸過程中肯定存在錯誤。許多CRC的硬件解碼電路就是按這種方式進行檢錯的。同時 可以看做是由t(x)和CRC校驗碼的組合,所以解碼時將接收到的二進制數據去掉尾部的r位數據,得到的就是原始數據。
爲了更清楚的瞭解CRC校驗碼的編碼過程,下面用一個簡單的例子來說明CRC校驗碼的編碼過程。由於CRC-32、CRC-16、CCITT和CRC-4的編碼過程基本一致,只有位數和生成多項式不一樣。爲了敘述簡單,用一個CRC-4編碼的例子來說明CRC的編碼過程。
設待發送的數據t(x)爲12位的二進制數據100100011100;CRC-4的生成多項式爲g(x)=x4+x+1 ,階數r爲4,即10011。首先在t(x)的末尾添加4個0構成 ,數據塊就成了1001000111000000。然後用g(x)去除 ,不用管商是多少,只需要求得餘數y(x)。下表爲給出了除法過程。
做除法次數    被除數/        g(x)/結果           餘數
0      1   001000111000000           100111000000 
     1   0011                             
      0   000100111000000     

1      1   00111000000     1000000 
      1   0011   
      0   00001000000

2     1   000000 1100 
     1   0011 
     0   001100

從上面表中可以看出,CRC編碼實際上是一個循環移位的模2運算。對CRC-4,我們假設有一個5   bits的寄存器,通過反覆的移位和進行CRC的除法,那麼最終該寄存器中的值去掉最高一位就是我們所要求的餘數。所以可以將上述步驟用下面的流程描述:
//reg是一個5   bits的寄存器
把reg中的值置0.  
把原始的數據後添加r個0.  
While   (數據未處理完)  
Begin  
If   (reg首位是1)  
reg   =   reg   XOR   0011.  
把reg中的值左移一位,讀入一個新的數據並置於register的0   bit的位置。  
End
reg的後四位就是我們所要求的餘數。
這種算法簡單,容易實現,對任意長度生成多項式的G(x)都適用。在發送的數據不長的情況下可以使用。但是如果發送的數據塊很長的話,這種方法就不太適合了。它一次只能處理一位數據,效率太低。爲了提高處理效率,可以一次處理4位、8位、16位、32位。由於處理器的結構基本上都支持8位數據的處理,所以一次處理8位比較合適。
爲了對優化後的算法有一種直觀的瞭解,先將上面的算法換個角度理解一下。在上面例子中,可以將編碼過程看作如下過程:
  由於最後只需要餘數,所以我們只看後四位。構造一個四位的寄存器reg,初值爲0,數據依次移入reg0(reg的0位),同時reg3的數據移出reg。有上面的算法可以知道,只有當移出的數據爲1時,reg才和g(x)進行XOR運算;移出的數據爲0時,reg不與g(x)進行XOR運算,相當與和0000進行XOR運算。就是說,reg和什麼樣的數據進行XOR移出的數據決定。由於只有一個bit,所以有 種選擇。上述算法可以描述如下,
//reg是一個4   bits的寄存器
初始化t[]={0011,0000}
把reg中的值置0.  
把原始的數據後添加r個0.  
While   (數據未處理完)  
Begin  
把reg中的值左移一位,讀入一個新的數據並置於register的0   bit的位置。
reg   =   reg   XOR   t[移出的位]
End
上面算法是以bit爲單位進行處理的,可以將上述算法擴展到8位,即以Byte爲單位進行處理,即CRC-32。構造一個四個Byte的寄存器reg,初值爲0x00000000,數據依次移入reg0(reg的0字節,以下類似),同時reg3的數據移出reg。用上面的算法類推可知,移出的數據字節決定reg和什麼樣的數據進行XOR。由於有8個bit,所以有 種選擇。上述算法可以描述如下:
//reg是一個4   Byte的寄存器
初始化t[]={…}//共有 =256項
把reg中的值置0.  
把原始的數據後添加r/8個0字節.  
While   (數據未處理完)  
Begin  
把reg中的值左移一個字節,讀入一個新的字節並置於reg的第0個byte的位置。
reg   =   reg   XOR   t[移出的字節]
End
算法的依據和多項式除法性質有關。如果一個m位的多項式t(x)除以一個r階的生成多項式g(x), ,將每一位 (0= <k <m)提出來,在後面不足r個0後,單獨去除g(x),得到的餘式位 。則將 後得到的就是t(x)由生成多項式g(x)得到的餘式。對於CRC-32,可以將每個字節在後面補上32個0後與生成多項式進行運算,得到餘式和此字節唯一對應,這個餘式就是上面算法種t[]中的值,由於一個字節有8位,所以t[]共有 =256項。多項式運算性質可以參見參考文獻[1]。這種算法每次處理一個字節,通過查表法進行運算,大大提高了處理速度,故爲大多數應用所採用。

 

摘自: 循環冗餘校驗, CRC的算法分析和程序實現

          西南交通大學計算機與通信工程學院   劉東

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章