易码技术论坛

 找回密码
 加入易码
搜索
查看: 446232|回复: 16

求助~lavax中的crc16程序的源代码

[复制链接]
发表于 2007-8-28 15:01:01 | 显示全部楼层
就是普通的16位crc,google一下就有了
现在还是觉得crc32比较好
 楼主| 发表于 2007-8-28 17:01:40 | 显示全部楼层
但是网上搜到的crc16程序算出的结果和wqx上的不一样,不知道为什么?
发表于 2007-8-28 17:03:23 | 显示全部楼层
如果只是为SAVE文件加校验,普通的加密方法就足够了~
发表于 2007-8-28 17:03:45 | 显示全部楼层
找错了吧
16位crc有n种公式
发表于 2007-8-28 17:05:04 | 显示全部楼层
md5算法比较好
 楼主| 发表于 2007-8-28 17:41:49 | 显示全部楼层
int cal_crc16(long ptr, long len)
{
   int crc, i;
   crc = 0;
   while( --len >= 0 )
   {
    crc = crc ^ (*ptr++);
    for(i = 0; i < 8; ++i)
      if(crc & 0x1)
        crc = ((crc >> 1) ^ 0xa001);
      else
        crc = crc >> 1;
   }
   return ( crc );
}
这是一种,不知道lavax用的是哪种?
发表于 2007-8-28 17:45:27 | 显示全部楼层
好像是16,5,1什么的
 楼主| 发表于 2007-8-28 17:51:03 | 显示全部楼层
lavax用的是查表法吗?
发表于 2007-8-28 17:51:44 | 显示全部楼层
好像,大概
 楼主| 发表于 2007-8-28 17:56:21 | 显示全部楼层
找到了,这个算法算出来的结果和lavax的一样
int crc_ta[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef
};
int cal_crc(long ptr,int len) {
int crc;
char da;


crc=0;
while(len--!=0) {
da=((crc/256)&0xff)/16; /* 暂存CRC的高四位 */
crc=crc<<4; /* CRC右移4位,相当于取CRC的低12位)*/
crc=crc^crc_ta[da^(*ptr/16)]; /* CRC的高4位和本字节的前半字节相加后查表计算CRC,
然后加上上一次CRC的余数 */
da=((crc/256)&0xff)/16; /* 暂存CRC的高4位 */
crc=crc<<4; /* CRC右移4位, 相当于CRC的低12位) */
crc=crc^crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本字节的后半字节相加后查表计算CRC,
然后再加上上一次CRC的余数 */
ptr++;
}
return(crc);
}
发表于 2007-8-28 18:00:16 | 显示全部楼层
这就对了.LavaX的crc算法不可能错
 楼主| 发表于 2007-8-28 18:12:35 | 显示全部楼层
顺带稍上一个crc32算法~
不知道速度怎么样,应该很慢,因为要生成参数表
long crc32_table[256];
long ulPolynomial = 0x04c11db7;

long Reflect(long ref, char ch)
{
long value;
int i;
value = 0;
// 交换bit0和bit7,bit1和bit6,类推
for(i = 1; i < (ch + 1); i++)
{
if(ref & 1) value= value |(1 << (ch - i));
ref= ref >>1;
}
return value;
}
void init_crc32_table()
{
long crc,temp;
long t1,t2;
int i,j;
long flag;
// 256个值
for(i = 0; i <= 0xFF; i++)
{
temp=Reflect(i, 8);
crc32_table= temp<< 24;
for (j = 0; j < 8; j++)
{

flag=crc32_table&0x80000000;
t1=(crc32_table << 1);
if(flag==0)
t2=0;
else
t2=ulPolynomial;
crc32_table =t1^t2 ;
}
crc=crc32_table;
crc32_table = Reflect(crc32_table, 32);
}
}
//生成参数表

long CRC32(long DataBuf,long len)
{
int i;
long m_CRC;
m_CRC = 0xFFFFFFFF;
init_crc32_table();
for(i=0;i<len;i++)
m_CRC=crc32_table[(m_CRC^(*(DataBuf+i)))&0xff] ^ (m_CRC>>8);

return ~m_CRC;
}
发表于 2007-8-28 23:44:10 | 显示全部楼层
crc,md5校验除了在保证数据的正确性,还有什么作用?
发表于 2007-9-3 18:46:30 | 显示全部楼层
版权保护,防修改
发表于 2007-9-4 10:51:18 | 显示全部楼层
在存档方面,确实可以用crc或md5来防修改,但是怎么保护版权?
发表于 2007-9-4 11:05:53 | 显示全部楼层
保护版权信息不被篡改
 楼主| 发表于 2007-8-28 00:41:45 | 显示全部楼层 |阅读模式
  lavax中crc16程序是如何写的?(lavax语言)
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 18:51 , Processed in 0.011685 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表