我的意思是用算法来实现,不用查表法,谢谢大家,重谢哦!!比如01 00 00 09 01我给这个数据,要用CRC16算法求出来,怎么写呢??
希望把所有的源代码给我帖出来,当然能给我写点注释就更好了,小妹先谢了!

解决方案 »

  1.   

    CRC16算法就是将一个二进制序列数左移16位后除以一个多项式,余数就是生成的CRC码.多用于网络数据传送,因为是按位计算,生成速度比较慢,所以多用查表法.下面给出的是用C写的产生CRC16码的源,我没翻成PASCAL,不过不难理解unsigned int cal_crc(unsigned char *ptr, unsigned char len) 

        unsigned char i; 
        unsigned int crc=0; 
        while(len--!=0) 
       {  
           for(i=0x80; i!=0; i/=2)
           { 
               if((crc&0x8000)!=0)
               {
                   crc*=2; crc^=0x1021;
                } /* 余式CRC乘以2再求CRC */ 
               else
                  crc*=2; 
               if((*ptr&i)!=0)
                  crc^=0x1021; /* 再加上本位的CRC */ 
           } 
           ptr++; 
        } 
        return(crc); 
    }
      

  2.   

    呵呵,因为我比较菜,所以我想你最好能用Delphi 的语句帮我实现下,谢谢了。
    还是用123这个和01 00 00 09 01为例行吗??
    多谢。^_^
      

  3.   

    unsigned int cal_crc(unsigned char *ptr, unsigned char len)
    //function cal_crc(ptr:pchar;len:short):intger; 

    //var
        unsigned char i; 
        unsigned int crc=0;
    //i:short;
    //crc:short;
    //begin
    //crc:=0; 
        while(len--!=0) 
    //while (len-1)<>0 do
       {  
       //begin
       //dec(len);
        for(i=0x80; i!=0; i/=2)
        //while i<>0 do
           { 
           //begin
           //i:=$80;
             if((crc&0x8000)!=0)
             //if (crc and $8000)<>0
            {
             //begin
             //crc:=crc shl 1;      crc*=2; 
             crc^=0x1021;
             //crc:=power(crc,$1021);
                }
              //end /* 余式CRC乘以2再求CRC */ 
               else
              //else
                  crc*=2;
                  //crc:=crc shl 1; 
               if((*ptr&i)!=0)
               //if (ord(ptr[0])and i)<>0
                  crc^=0x1021; /* 再加上本位的CRC */
               //crc:=power(crc,$1021);
              //i:=i div 2; 
           } 
           ptr++;
           //inc(ptr); 
        } 
        return(crc); 
        //result:=crc;
    }逐句翻的,没测试,不知行不行.