迴圈冗餘碼crc

2022-05-14 19:44:33 字數 3937 閱讀 8690

待編碼的有效資訊組多項式:m(x)

生成多項式(產生校驗碼的多項式):g(x)

餘數多項式:r(x)

商:q(x)

生成多項式是四次的,所以某個多項式除以生成多項式的余式肯定是三次的,所以要加四位0000。

生成多項式的選擇是經過實際應用選擇出來的,要滿足一定的要求。

r(x)為r階,在m(x)後面添上r個0(r(x)有r + 1 位)。

m(x)*x^k = q(x)*g(x) + r(x)

模2運算

crc碼是基於模2運算而建立編碼規律的校驗碼。模2運算的特點是不考慮進製和借位的運算。其規律如下:

1、模2加和模2減的結果是相等的,即:0 +/- 1 = 1, 0 +/- 0 = 0, 1 +/- 0 = 1, 1 +/- 1 = 0。兩個相同的數的模2和恒為0。

2、模2乘是按模2和求部分積之和。(和十進位制乘法類似)

3、模2除是按模2減求部分餘數。每求一位商應使部分餘數減少一位。上商的原則是:當部分餘數的首位為1時,上商1;當部分餘數的首位為0時,上商0。當部分餘數的位數小於除數的位數時,該餘數即為最後餘數。

1 1 1 0

────────

1 0 1 1〕1 1 0 0 1 0 0

-1 0 1 1

──────

1 1 1 1

- 1 0 1 1

──────

1 0 0 0

- 1 0 1 1

──────

0 1 1 0

- 0 0 0 0

──────

1 1 0

例如m(x)=1100

g(x)=1011

用1100000 除以 1011得crc碼為1100010

有效資訊為4位,校驗位為3位,所以有稱為(7,4)碼。

校驗方法:

將收到的迴圈校驗碼用約定的生成多項式g(x)去除,如果無錯,則餘數應為0;如果某一位出錯,則餘數不為0,不同的出錯為對應不同的餘數。對餘數補0後繼續除下去,餘數將按照一定的序列迴圈下去(迴圈碼的由來)。

具體可參考:

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的位置。 

endreg的後四位就是我們所要求的餘數。

這種演算法簡單,容易實現,對任意長度生成多項式的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=在後面不足r個0後,單獨去除g(x),得到的余式位 。則將 後得到的就是t(x)由生成多項式g(x)得到的余式。對於crc-32,可以將每個位元組

在後面補上32個0後與生成多項式進行運算,得到余式和此位元組唯一對應,這個余式就是上面演算法種t中的值,由於乙個位元組有8位,所以t共

有 =256項。多項式運算性質可以參見參考文獻[1]。這種演算法每次處理乙個位元組,通過查表法進行運算,大大提高了處理速度,故為大多數應用所採用。

摘自:迴圈冗餘校驗 crc的演算法分析和程式實現

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

CRC迴圈冗餘校驗碼

1 crc crc迴圈冗餘校驗碼是資料通訊中的一種查錯校驗碼。迴圈冗餘檢查對資料進行多項式計算,將計算結果附加在幀後面,接收資料的裝置執行模2運算,保證資料傳輸的正確性和完整性。2.模2除法 不向上借位,只要除數和被除數的位數相同就可進行計算,不比較它們的大小 模2運算中用到了模2減法,與邏輯異或相...

迴圈冗餘校驗碼CRC

一 基本原理 crc檢驗原理實際上就是在乙個p位二進位制資料序列之後附加乙個r位二進位制檢驗碼 序列 從而構成乙個總長為n p r位的二進位制序列 附加在資料序列之後的這個檢驗碼與資料序列的內容之間存在著某種特定的關係。如果因干擾等原因使資料序列中的某一位或某些位發生錯誤,這種特定關係就會被破壞。因...

CRC迴圈冗餘校驗碼

crc迴圈冗餘校驗碼 crc cyclic redundancy check 迴圈冗餘校驗碼 是常用的校驗碼,在早期的通訊中運用廣泛,因為早期的通訊技術不夠可靠 不可靠性的 是通訊技術決定的,比如電磁波通訊時受雷電等因素的影響 不可靠的通訊就會帶來 確認資訊 的困惑,書上提到紅軍和藍軍通訊聯合進攻山...