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