• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    CRC校驗源碼分析

    作者: 時間:2012-05-16 來源:網(wǎng)絡(luò) 收藏

     0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,

    本文引用地址:http://www.czjhyjcfj.com/article/149046.htm

      0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,

      0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,

      0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,

      0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,

      0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,

      0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,

      0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,

      0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,

      0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0

      };

      根據(jù)這個思路,可以寫出以下程序:

      uint table_crc(uchar *ptr,uchar len) // 字節(jié)查表法求

      {

      uchar da;

      while(len--!=0)

      {

      da=(uchar) (crc/256); // 以 8 位二進制數(shù)暫存 的高 8 位

      crc=8; // 左移 8 位

      crc^=crc_ta[da^*ptr]; // 高字節(jié)和當(dāng)前數(shù)據(jù) XOR 再查表

      ptr++;

      }

      return(crc);

      }

      本質(zhì)上 計算的就是移位和異或。所以一次處理移動幾位都沒有關(guān)系,只要做相應(yīng)的處理就好了。

      下面給出半字節(jié)查表的處理程序。其實和全字節(jié)是一回事。

      code uint crc_ba[16]={

      0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,

      0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,

      };

      uint ban_crc(uchar *ptr,uchar len)

      {

      uchar da;

      while(len--!=0)

      {

      da = ((uchar)(crc/256))/16;

      crc = 4;

      crc ^=crc_ba[da^(*ptr/16)];

      da = ((uchar)(crc/256)/16);

      crc = 4;

      crc ^=crc_ba[da^(*ptr0x0f)];

      ptr++;

      }

      return(crc);

      }

      crc_ba[16]和crc_ta[256]的前 16 個余式是一樣的。

      其實講到這里,就已經(jīng)差不多了。反正當(dāng)時我以為自己是懂了。結(jié)果去看別人的源代碼的時候,也是說采用 CCITT,但是是反相的。如圖 3

      

      反過來,一切都那么陌生,faint.吐血,吐血。

      仔細(xì)一下,也可以很容易寫出按位異或的程序。只不過由左移變成右移。

      uint crc16r(unsigned char *ptr, unsigned char len)

      {

      unsigned char i;

      while(len--!=0)

      {

      for(i=0x01;i!=0;i = 1)

      {

      if((crc0x0001)!=0) {crc >>= 1; crc ^= 0x8408;}

      else crc >>= 1;

      if((*ptri)!=0) crc ^= 0x8408;



    關(guān)鍵詞: 分析 源碼 校驗 CRC

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 新乡县| 子洲县| 阳朔县| 枞阳县| 基隆市| 县级市| 武山县| 淮安市| 上饶县| 惠州市| 龙州县| 咸阳市| 通道| 册亨县| 阜阳市| 龙南县| 三明市| 万全县| 阿拉善右旗| 宁明县| 昌江| 怀宁县| 南澳县| 家居| 江山市| 怀来县| 泉州市| 高要市| 泗水县| 涪陵区| 延寿县| 保康县| 东平县| 定西市| 罗甸县| 九江市| 清徐县| 樟树市| 宣恩县| 香河县| 青州市|