日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...

發(fā)布時(shí)間:2024/3/24 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

crc校驗(yàn)方法,用c語言實(shí)現(xiàn)源代碼(CRC checksum method, using C language source code)

crc校驗(yàn)方法,用c語言實(shí)現(xiàn)源代碼(CRC checksum method, using C language source code)

CRC (Cyclic Redundancy Check) 校驗(yàn)應(yīng)用較為廣泛, 以前為了處理簡單, 在程序中大多數(shù)采用lrc (longitudinal Redundancy Check) 校驗(yàn), lrc校驗(yàn)很好理解, 編程實(shí)現(xiàn)簡單.用了一天時(shí)間研究了crc的c語言實(shí)現(xiàn), 理解和掌握了基本原理和c語言編程.結(jié)合自己的理解簡單寫下來.

1、crc簡介

Crc檢驗(yàn)的基本思想是利用線性編碼理論, 在發(fā)送端根據(jù)要傳送的k位二進(jìn)制碼序列, 以一定的規(guī)則產(chǎn)生一個(gè)檢驗(yàn)碼r位 (就是crc碼), 附在信息后面, 構(gòu)成一個(gè)新的二進(jìn)制碼序列數(shù)共 (K + R) 位, 最后發(fā)送出去.接收端根據(jù)同樣的規(guī)則校驗(yàn), 以確定傳送中是否出錯(cuò).接收端有兩種處理方式: 1、計(jì)算k位序列的crc碼, 與接收到的crc比較, 一致則接收正確.2、計(jì)算整個(gè)k + r位的crc碼, 若為0, 則接收正確.

Crc碼有多種檢驗(yàn)位數(shù), 8位、16位、32位等, 原理相同.16位的crc碼產(chǎn)生的規(guī)則是先將要發(fā)送的二進(jìn)制序列數(shù)左移16位 (即乘以2的16次方后), 除以一個(gè)多項(xiàng)式, 最后所得到的余數(shù)就是crc碼.

求crc碼所采用的是模2運(yùn)算法則, 即多項(xiàng)式除法中采用不帶借位的減法運(yùn)算, 運(yùn)算等同于異或運(yùn)算.這一點(diǎn)要仔細(xì)理解, 是編程的基礎(chǔ).

CRC - 16: (美國二進(jìn)制同步系統(tǒng)中采用) 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、按位計(jì)算crc

采用crc - ccitt多項(xiàng)式, 多項(xiàng)式為0x11021, c語言編程時(shí), 參與計(jì)算為0x1021, 這個(gè)地方得深入思考才能體會(huì)其中的奧妙, 分享一下我的思路: 當(dāng)按位計(jì)算crc時(shí), 例如計(jì)算二進(jìn)制序列為1001 1010 1010 1111時(shí), 將二進(jìn)制序列數(shù)左移16位, 即為1001 1010 1010 (1111 0000 0000 0000 0000 0000 0000 0000), 實(shí)際上該二進(jìn)制序列可拆分為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 +......)

現(xiàn)在開始分析運(yùn)算:

< 1 > 對(duì)第一個(gè)二進(jìn)制分序列求余數(shù), 豎式除法即為0x10000 ^ 0x11021運(yùn)算, 后面的0位保留;

< 2 > 接著對(duì)第二個(gè)二進(jìn)制分序列求余數(shù), 將第一步運(yùn)算的余數(shù) * 2后再和第二個(gè)二進(jìn)制分序列一起對(duì)0x11021求余, 這一步理解應(yīng)該沒什么問題.如果該分序列為0, 無需計(jì)算.

對(duì)其余的二進(jìn)制序列求余與上面兩步相同 < 3 >.

< 4 > 計(jì)算到最后一位時(shí)即為整個(gè)二進(jìn)制序列的余數(shù), 即為crc校驗(yàn)碼.

該計(jì)算方法相當(dāng)于對(duì)每一位計(jì)算,

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

總結(jié)

以上是生活随笔為你收集整理的c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。