CRC迴圈冗餘校驗

2022-08-16 18:30:16 字數 1639 閱讀 3326

原理:

要計算n位的crc值,將待crc的資料左移n位(即在其最右端新增n個0),如果待crc資料的最高位為0,不進行任何操作,否則將其與事先設定好的除數(divisor)進行異或操作,然後將除數右移一位。重複上述兩個操作直到除數到達待crc資料的右端。舉例如下:

11010011101100 000 <--- input left shifted by 3 bits

1011 <--- divisor

01100011101100 000 <--- result

1011 <--- divisor ...

00111011101100 000

1011

00010111101100 000

1011

00000001101100 000

1011

00000000110100 000

1011

00000000011000 000

1011

00000000001110 000

1011

00000000000101 000

101 1

-----------------

00000000000000 100 <---remainder (3 bits)

實現:理想的迴圈冗餘校驗演算法應具有以下特徵:

crc相同的資料多次,每次得到的crc值應該相同。這也是通訊過程中通過crc校驗資料在收發過程中是否出錯的基本依據。

crc不同的資料得到的crc值應該不等。(儘管通過估計偽造可能得到相同的crc值,但要確保這種概率很小)

對於32位的crc來說,它能區分2^32的資料,即長度為2^32的兩個資料,只要有任何兩位的值不同,它們分別經過crc後得到的crc值就不同。

生成crc的步驟:

生成crc查詢表,crc可通過靜態方式從權威機構查詢或自己通過動態方式生成。對於crc32來說,它的crc查詢表包含256個數字。

取待crc的資料的第乙個位元組,根據該位元組資料內容和當前的crc值生成新的crc值。

取待待crc的資料的下乙個位元組,並返回步驟2,直到待crc的資料的最後乙個位元組結束。

靜態方式的crc查詢表例項如下:

uint32_t s_arrdwcrc32table[256] =

;

動態方式生成crc查詢表的**如下:

void generatecrctable(void)

m_pdwcrc32table[i] = dwcrc;

}}

對於字元流資料進行校驗的**如下:

void calccrc32(const uint8_t byte, uint32_t &dwcrc32)

uint32_t stringcrc32(const char* szstring, uint32_t &dwcrc32)

} catch(...)

dwcrc32 = ~dwcrc32;

cout << endl << dwcrc32 << endl;

return dwerrorcode;

}

有關迴圈冗餘校驗的原理可參考:

有關迴圈冗餘校驗的**可參考:

迴圈冗餘校驗 CRC校驗

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

迴圈冗餘校驗CRC

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

CRC迴圈冗餘校驗

crc校驗原理 crc校驗原理看起來比較複雜,好難懂,因為大多數書上基本上是以二進位制的多項式形式來說明的。其實很簡單的問題,其根本思想就是先在要傳送的幀後面附加乙個數 這個就是用來校驗的校驗碼,但要注意,這裡的數也是二進位制序列的,下同 生成乙個新幀傳送給接收端。當然,這個附加的數不是隨意的,它要...