CRC16算法,不要求用查表法,谢谢大家,小妹分不多 我的意思是用算法来实现,不用查表法,谢谢大家,重谢哦!!比如01 00 00 09 01我给这个数据,要用CRC16算法求出来,怎么写呢??希望把所有的源代码给我帖出来,当然能给我写点注释就更好了,小妹先谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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); } 呵呵,因为我比较菜,所以我想你最好能用Delphi 的语句帮我实现下,谢谢了。还是用123这个和01 00 00 09 01为例行吗??多谢。^_^ 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;}逐句翻的,没测试,不知行不行. 我发现一个删除表记录的问题请懂得人帮我解释一下 如何用Delphi程序抓取一个网站下的所有网页? yy 我想让FORM 的右上角的关闭按钮不能用,只用一个最小化按钮,如何做? 用JAVA做一个网上象棋对战,要学JAVA的来共同探讨! 请教一个DLL的问题 TTCPClient,TTCPServer中如何传递流 如何配置程序? EXCEL 导入 SQL SERVER 2000 的问题 如何遍历文件夹中的文件并得到类似文件名。 wsprintf的用法 请大家推荐一款桌面型数据库。
{
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);
}
还是用123这个和01 00 00 09 01为例行吗??
多谢。^_^
//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;
}逐句翻的,没测试,不知行不行.