亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

使用C語言實現CRC校驗的方法

2020-01-26 16:14:23
字體:
來源:轉載
供稿:網友

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) = X32 + X26 + X23 + X22 + X16 +X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1

2、按位計算CRC

采用CRC-CCITT多項式,多項式為0x11021,C語言編程時,參與計算為0x1021,這個地方得深入思考才能體會其中的奧妙,分享一下我的思路:當按位計算CRC時,例如計算二進制序列為1001 1010 1010 1111時,將二進制序列數左移16位,即為1001 1010 1010 1111 (0000 0000 0000 0000),實際上該二進制序列可拆分為1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + ……
現在開始分析運算:
<1>對第一個二進制分序列求余數,豎式除法即為0x10000 ^ 0x11021運算,后面的0位保留;
<2>接著對第二個二進制分序列求余數,將第一步運算的余數*2后再和第二個二進制分序列一起對0x11021求余,這一步理解應該沒什么問題。如果該分序列為0,無需計算。
<3>對其余的二進制序列求余與上面兩步相同。
<4>計算到最后一位時即為整個二進制序列的余數,即為CRC校驗碼。
該計算方法相當于對每一位計算,運算過程很容易理解,所占內存少,缺點是一位一位計算比較耗時。
下面給出C語言實現方法:

復制代碼 代碼如下:

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 = temp ^ 0x11021;

         if((*ptr & i) != 0)
            temp = temp ^ (0x10000 ^ 0x11021);

     }
    ptr++;
   }
   crc = temp;
   printf("0x%x ",crc);
}


上面的程序根據運算分析而來,很容易理解。為了節約內存空間,我們對程序作進一步的簡化。分析可知,當二進制序列中上一位計算的余數第15bit位為1時,即( 上一位計算的余數 & 0x8000) != 0,計算本位時,上一位余數 * 2后可對0x11021作求余運算,然后再加上本位計算所得余數。這個很好理解,也就是說,打個比方,把它看作簡單的除法,計算上一位時的余數乘以2后,如果比較大可以當被除數,就再去除除數求余。有一點和普通除法不同的是,因為多項式除法中采用不帶借位的減法運算,所以0x10000也可以被0x11021除,余數并非為0x10000,而是0x1021。這個自己動手算一下就知道了。余數之和也是不帶進位的加法運算,即異或。最后還強調一點,因為二進制序列是左移16位后參與運算的,所以,一直算到序列的最后一位也是可以被除的,這點大家要明白。下面給出簡化后的C語言實現。
復制代碼 代碼如下:

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 int crc = 0;
   unsigned char i;
   unsigned char *ptr = test;

   while( len-- ) {
      for(i = 0x80; i != 0; i = i >> 1) {
        if((crc & 0x8000) != 0) {
           crc = crc << 1;
           crc = crc ^ 0x1021;
        }
        else {
           crc = crc << 1;
        }
        if((*ptr & i) != 0) {
          crc = crc ^ 0x1021;
        }
     }
     ptr++;
   }

   printf("0x%x ",crc);
}


上面這段程序網上較為常見,但亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九九热在线精品视频| 自拍偷拍亚洲区| 精品国产91乱高清在线观看| 美日韩丰满少妇在线观看| 国产精品电影观看| 高清一区二区三区日本久| 中文字幕日韩欧美| 国产成人在线一区| 国产精品999999| 精品视频久久久| 日韩免费观看视频| 国产精品99久久久久久人| 91地址最新发布| 色综合亚洲精品激情狠狠| 亚洲精品电影网在线观看| 久久久久久国产三级电影| 欧美日韩国产成人在线| 亚洲精品国产品国语在线| 亚洲精品一区二区久| 国产亚洲日本欧美韩国| 最近日韩中文字幕中文| 久久伊人91精品综合网站| 欧美午夜激情小视频| 91精品国产91久久久久久最新| 国产精品视频网址| 久久中文字幕在线| 92福利视频午夜1000合集在线观看| 亚洲自拍欧美另类| 久久精品男人天堂| 亚洲欧美在线第一页| 国产aⅴ夜夜欢一区二区三区| 日韩电影第一页| 91国语精品自产拍在线观看性色| 欧美xxxx14xxxxx性爽| 精品久久久一区二区| 精品亚洲一区二区三区在线观看| 26uuu另类亚洲欧美日本一| 国产精品高清在线观看| 亚洲男人第一av网站| 久久亚洲国产成人| 亚洲毛片在线看| 日韩视频免费观看| 亚洲在线免费看| 国模极品一区二区三区| 久久亚洲精品毛片| 欧美做受高潮电影o| 亚洲综合在线播放| 日韩在线视频中文字幕| 久久精品久久久久久国产 免费| 国产欧美在线播放| 亚洲成人在线视频播放| 日韩精品免费在线播放| 伊人伊成久久人综合网小说| 亚洲成人性视频| 国产精品入口免费视频一| 2019中文字幕在线免费观看| 精品日本美女福利在线观看| 日韩动漫免费观看电视剧高清| 欧美视频13p| 久久免费高清视频| 国产一区二区三区三区在线观看| 2019亚洲日韩新视频| 久久黄色av网站| 午夜精品久久久久久久久久久久久| 亚洲图片在区色| 国产精品高清在线观看| 日韩av在线网址| 91精品国产综合久久久久久蜜臀| 色偷偷亚洲男人天堂| 国产亚洲视频中文字幕视频| 国产精品国产自产拍高清av水多| 国产精品免费看久久久香蕉| 欧美性猛xxx| 精品久久久久久中文字幕大豆网| 欧美性理论片在线观看片免费| 久久五月天色综合| 欧美日韩成人在线观看| 色婷婷av一区二区三区在线观看| 欧美成年人视频网站| 日韩精品一二三四区| 日本中文字幕不卡免费| 国产成人精品久久二区二区91| 国产91精品青草社区| 日韩欧美在线国产| 亚洲人成77777在线观看网| 色综合色综合网色综合| 久久久久久久一区二区三区| 国产综合色香蕉精品| 国产精品久久9| 亚洲人成免费电影| 国产精彩精品视频| 国产精品视频公开费视频| 亚洲999一在线观看www| 日本人成精品视频在线| 精品美女国产在线| 精品一区电影国产| 午夜精品久久久久久久白皮肤| 浅井舞香一区二区| 国产精品亚发布| 最好看的2019的中文字幕视频| 亚洲国产欧美精品| 日韩乱码在线视频| 一区国产精品视频| 欧美一区二区.| 精品国产网站地址| www.亚洲天堂| 国产热re99久久6国产精品| 国产欧美日韩最新| 久久激情五月丁香伊人| 98午夜经典影视| 国产激情综合五月久久| 日韩欧美国产网站| 欧洲s码亚洲m码精品一区| 91极品视频在线| 国产一区二区成人| 欧美日韩中文字幕综合视频| 久久香蕉国产线看观看网| 中文字幕日韩电影| 国产69精品久久久久9999| 欧美成人激情视频免费观看| 国产精品视频免费在线| 欧美午夜精品久久久久久人妖| 欧美日韩精品在线| 亚洲国产小视频在线观看| 欧美成人精品三级在线观看| 91久久久久久久久久久久久| 欧美理论电影在线播放| 国产在线拍偷自揄拍精品| 自拍偷拍免费精品| 精品网站999www| 国产精品久久久久久av| 国产亚洲精品综合一区91| 日韩一区av在线| 成人信息集中地欧美| 亚洲精品国产美女| 欧美性猛交视频| 57pao成人国产永久免费| 亚洲欧美日韩国产成人| 国产视频一区在线| 日韩动漫免费观看电视剧高清| 国产成人精品日本亚洲| 亚洲欧美在线第一页| 亚洲自拍偷拍色图| www.日韩.com| 国产美女被下药99| 欧美精品激情在线观看| 亚洲国产精品视频在线观看| 国产第一区电影| 亚洲2020天天堂在线观看| www.日本久久久久com.| 欧美一级视频免费在线观看| 91精品视频一区| 日韩在线视频观看正片免费网站| 在线亚洲午夜片av大片| 亚洲高清免费观看高清完整版| 亚洲欧美精品一区二区| 理论片在线不卡免费观看| 久久精品免费播放| 午夜精品一区二区三区在线播放| 911国产网站尤物在线观看| 欧美午夜www高清视频| 亚洲激情视频网| 91久久精品日日躁夜夜躁国产| 欧美激情视频在线观看|