1. 程式人生 > 其它 >CRC查表法運算原理

CRC查表法運算原理

CRC校驗是依據多項式模2運算進行的,這裡有兩點:

1. 一個二進位制串總可以表示為多項式,例如:

10101 表示為x^{4}+x^{2}+1

10111 表示為x^{4}+x^{2}+x^{1}+1,依次類推更長資料的表示方法。

2. 模2運算的基本規則如下:

加法:0+0=0 1+0=1 0+1=1 1+1=0 不進位

減法:0-0=0 0-1=1 1-0=1 1-1=0 不借位

模2加減運算與二進位制異或運算相同

乘法:依據多項式模2加法算得(x^{2}+1)(x^{4}+x^{2}+1) = x^{6}+x^{4}+x^{4}+x^{2}+x^{2}+1 = x^{6}+1

除法:依據多項式模2減法算得\frac{x^{6}+1}{x^{2}+1}

多項式模2運算滿足分配律和結合律:已知多項式X(n) \ X(m) \ X(k)

(X(n)+X(m))X(k) = X(n)X(k)+X(m)X(k)

(X(n)+X(m))/X(k) = X(n)/X(k)+X(m)/X(k)

一個多項式模2加上自身恆為0,即X(n) + X(n) = 0

CRC校驗碼生成方式為多項式除法求餘。準備一組待發送的二進位制資料和一個除數,將二進位制資料左移n位,再依照多項式模2除法除以除數,取得的餘數即為CRCn的校驗碼。例如CRC8校驗碼生成方法為:待發送二進位制資料左移8位,右端補0,將左移後的資料模2除以除數,算得CRC8的校驗碼。

傳送端和接收端事先約定一個除數,傳送端生成CRC校驗碼,加到左移後的待發送二進位制資料上,將加運算後的資料傳送給接收端。接收端依次接收二進位制資料,首先接收的為多項式高位,最後接收的為二進位制低位,按照多項式模2除法將接收到的二進位制資料除以事先約定的除數,若求得餘數為0則接收成功;否則接收失敗。

例如待發送資料101001110100001,除數111010101共9位,將待發送資料左移9位,進行多項式模2除法,運算過程如下:

求得餘數為100011000。最後傳送端傳送的資料為:101001110100001 100011000,後9位為餘數。接收端獲得二進位制資料串後,直接用100011000模2除,求得餘數為0。

現假設待發送二進位制資料為10100111010000100,將待發送二進位制資料分為每9位一塊。再進行模2除法:

對於每塊資料的求餘,其運算相當於該塊異或上述加紅二進位制串。例如中間塊100001000,餘數= 該塊^ 100000000 ^ 010000000 ^ 010101000 ^ 101010100 = 該塊^a^b^c^d; 其中a、b、c、d表示這些二進位制塊;當該塊異或所得<除數時開始後一塊的異或運算。

例如:中間塊100001000異或所得依次為000001000 010001000 000100000 101110100,101110100 < 111010101時開始後一塊的運算。

根據異或的結合律,餘數= 該塊^a^b^c^d =該塊^(a^b^c^d)。a、b、c、d的數值與前一塊相關。

CRC查表法原理

現構建一個表格,將每一塊所對應的a^b^c^d儲存起來。輸入一個數據塊,查表得到下一塊需要異或的數值。例如上例中101001110對應表格內容為100000000 ^ 010000000 ^ 010101000 ^ 101010100,其剛好是101001110的CRC校驗碼。

某塊的餘數 = 該塊^上一塊查表輸出。依次向後計算得到最後一塊的餘數,即為二進位制串的CRC校驗碼。實現偽碼為:

crc_table[2^n];
for(i : 2^n)
   crc_table[i] = i的CRCn校驗碼;

crc = input; //輸入1塊
while
   input + 1
   crc = crc_table[crc]^(input);

在計算CRC8時表格需要2^{8}項,計算CRC16時表格需要2^{16}項,CRC32則需要很大的表格,資源浪費十分嚴重。對於CRC32運算,仍使用2^{8}項的表格,每一項為8位資料對應的CRC32校驗碼,讓輸入資料流依次按位元組移動並與查表輸出值異或即得到CRC32校驗碼。除表格不同外,其他過程與CRC8運算相似。