新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > CRC校驗源碼分析

        CRC校驗源碼分析

        作者: 時間:2012-05-16 來源:網絡 收藏

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

        本文引用地址:http://www.104case.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

          };

          根據這個思路,可以寫出以下程序:

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

          {

          uchar da;

          while(len--!=0)

          {

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

          crc=8; // 左移 8 位

          crc^=crc_ta[da^*ptr]; // 高字節和當前數據 XOR 再查表

          ptr++;

          }

          return(crc);

          }

          本質上 計算的就是移位和異或。所以一次處理移動幾位都沒有關系,只要做相應的處理就好了。

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

          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 個余式是一樣的。

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

          

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

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

          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;



        關鍵詞: 分析 源碼 校驗 CRC

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 沁水县| 舟山市| 黔江区| 偃师市| 集贤县| 衡水市| 增城市| 镇沅| 咸宁市| 南郑县| 连云港市| 镇远县| 黔东| 杭锦旗| 南通市| 英山县| 扬中市| 浦县| 丹棱县| 凤山县| 姜堰市| 五峰| 韩城市| 石城县| 平陆县| 简阳市| 登封市| 定州市| 海口市| 吐鲁番市| 泸州市| 灵石县| 临朐县| 浦北县| 广元市| 乐东| 高清| 闵行区| 浦城县| 雅安市| 西充县|