c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...
crc校驗方法,用c語言實現源代碼(CRC checksum method, using C language source code)
crc校驗方法,用c語言實現源代碼(CRC checksum method, using C language source code)
CRC (Cyclic Redundancy Check) 校驗應用較為廣泛, 以前為了處理簡單, 在程序中大多數采用lrc (longitudinal Redundancy Check) 校驗, lrc校驗很好理解, 編程實現簡單.用了一天時間研究了crc的c語言實現, 理解和掌握了基本原理和c語言編程.結合自己的理解簡單寫下來.
1、crc簡介
Crc檢驗的基本思想是利用線性編碼理論, 在發送端根據要傳送的k位二進制碼序列, 以一定的規則產生一個檢驗碼r位 (就是crc碼), 附在信息后面, 構成一個新的二進制碼序列數共 (K + R) 位, 最后發送出去.接收端根據同樣的規則校驗, 以確定傳送中是否出錯.接收端有兩種處理方式: 1、計算k位序列的crc碼, 與接收到的crc比較, 一致則接收正確.2、計算整個k + r位的crc碼, 若為0, 則接收正確.
Crc碼有多種檢驗位數, 8位、16位、32位等, 原理相同.16位的crc碼產生的規則是先將要發送的二進制序列數左移16位 (即乘以2的16次方后), 除以一個多項式, 最后所得到的余數就是crc碼.
求crc碼所采用的是模2運算法則, 即多項式除法中采用不帶借位的減法運算, 運算等同于異或運算.這一點要仔細理解, 是編程的基礎.
CRC - 16: (美國二進制同步系統中采用) G (X) = x16 + x15 + x2 + 1
CRC CCITT: (由歐洲ccitt推薦) G (X) = x16 + X12 + X5 + 1
CRC - 32: G (X) = + x22 + x32 + x26 X23 + x16 + X12 + X11 + X10 + x8 + X5 + X4 + + X7 x1 + x2 + 1
2、按位計算crc
采用crc - ccitt多項式, 多項式為0x11021, c語言編程時, 參與計算為0x1021, 這個地方得深入思考才能體會其中的奧妙, 分享一下我的思路: 當按位計算crc時, 例如計算二進制序列為1001 1010 1010 1111時, 將二進制序列數左移16位, 即為1001 1010 1010 (1111 0000 0000 0000 0000 0000 0000 0000), 實際上該二進制序列可拆分為1000 (0000 0000 0000 0000 0000 0000 0000 (000) + 0000 0000 0000 0000 0000 0000 0000 (00) + 0000 0000 0000 1 0000 0000 0000 0000) + (0000 0000 0000 0000 +......)
現在開始分析運算:
< 1 > 對第一個二進制分序列求余數, 豎式除法即為0x10000 ^ 0x11021運算, 后面的0位保留;
< 2 > 接著對第二個二進制分序列求余數, 將第一步運算的余數 * 2后再和第二個二進制分序列一起對0x11021求余, 這一步理解應該沒什么問題.如果該分序列為0, 無需計算.
對其余的二進制序列求余與上面兩步相同 < 3 >.
< 4 > 計算到最后一位時即為整個二進制序列的余數, 即為crc校驗碼.
該計算方法相當于對每一位計算,
The operation process is easy to understand and accounts for less memory. The disadvantage is that one bit computing is time-consuming.
C language implementation is given below:
Copy the code code as follows:
Unsigned, char, test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa, 0xbb, 0xCC, 0xdd, 0xEE, 0xff};
Unsigned char len = 16;
Void main (void)
{
Unsigned long temp = 0;
Unsigned int crc;
Unsigned char i;
Unsigned, char, *ptr = test;
While (len--) {
For (I = 0x80, I = 0, I = I, 1) {
Temp = temp * 2;
If ((temp & 0x10000) = = 0)
Temp
總結
以上是生活随笔為你收集整理的c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言scanf中 作用,c语言中sca
- 下一篇: siki学院_Unity初级案例_愤怒的