網上搜到的內容不全面,維基百科講的比較好,原理很清楚傳送門
。其實對於程式設計師來講,不用太在意它的數學原理,另外生成碼的選擇不是隨意的,這可能影響到校驗的效能。
注意其中的加法不進製,減法不借位,類似是異或邏輯。
關於怎樣產生crc,有這樣乙個演算法:
下面為crc的計算過程:
1.設定crc暫存器,並給其賦值ffff(hex)。
2.將資料的第乙個8-bit字元與16位crc暫存器的低8位進行異或,並把結果存入crc暫存器。
3.crc暫存器向右移一位,msb補零,移出並檢查lsb。
4.如果lsb為0,重複第三步;若lsb為1,crc暫存器與多項式碼相異或。
5.重複第3與第4步直到8次移位全部完成。此時乙個8-bit資料處理完畢。
6.重複第2至第5步直到所有資料全部處理完成。
7.最終crc暫存器的內容即為crc值。
modbus的手冊上給出了權威的版本:
附上一段**示例
u16 getcrccode(u8* buf, int len) //生成從buf開始的len個位元組的crc16碼
else
crc >>= 1;
} }return crc;
}
迴圈冗餘校驗 CRC校驗
一 crc校驗概念 即迴圈冗餘校驗碼 cyclic redundancy check 是資料通訊領域中最常用的一種查錯校驗碼,迴圈冗餘檢查 crc 是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的結果附在幀的後面,接收裝置也執行類似的演算法,以保證資料傳輸的正確性和完整性。其特徵是資訊字段和...
CRC迴圈冗餘校驗
crc校驗原理 crc校驗原理看起來比較複雜,好難懂,因為大多數書上基本上是以二進位制的多項式形式來說明的。其實很簡單的問題,其根本思想就是先在要傳送的幀後面附加乙個數 這個就是用來校驗的校驗碼,但要注意,這裡的數也是二進位制序列的,下同 生成乙個新幀傳送給接收端。當然,這個附加的數不是隨意的,它要...
CRC迴圈冗餘校驗
一 背景知識 1 位元差錯 現實的通訊鏈路都不會是理想的,因為位元在傳輸過程中可能產生差錯 1可能變成0,0可能變成1,這就叫做位元差錯。2 誤位元速率 在一段時間內,傳輸錯誤的位元佔所傳輸的位元總數的比率成為誤位元速率。誤位元速率和訊雜比有很大的關係,如果設法提高訊雜比,就可以使誤位元速率減小。3...