迴圈冗餘校驗法

2021-05-22 20:56:27 字數 3001 閱讀 2472

問題:

如果crc的生成多項式為g(x)=x4+x+1,資訊碼字為10110,則計算出的crc校驗碼是    

a.0100   b.1010   c.0111   d.1111  

回答: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)=   ,階數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=  

把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=摘自:迴圈冗餘校驗   crc的演算法分析和程式實現  

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

迴圈冗餘校驗 CRC校驗

一 crc校驗概念 即迴圈冗餘校驗碼 cyclic redundancy check 是資料通訊領域中最常用的一種查錯校驗碼,迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。其特徵是資訊字段和...

迴圈冗餘校驗CRC

網上搜到的內容不全面,維基百科講的比較好,原理很清楚傳送門 其實對於程式設計師來講,不用太在意它的數學原理,另外生成碼的選擇不是隨意的,這可能影響到校驗的效能。注意其中的加法不進製,減法不借位,類似是異或邏輯。關於怎樣產生crc,有這樣乙個演算法 下面為crc的計算過程 1 設定crc暫存器,並給其...

Qt CRC迴圈冗餘校驗

include mainwindow.h include define poly 0x1021 生成多項式 如果是傳送資料時呼叫,是為了得到餘數 如果是接收資料時呼叫,是為了校驗,如果結果為0,則正確,否則不正確 uint crc unsigned char addr,int len return ...