crc32精简版
请问一下CRC32的校验有没有精简版有CRC32的列表占据了1K多的FLASH 不够用了 请帮忙呢 不用查表法呗,自己按算法写个程序算不就行了 用半字节查表,这个算是性能/空间占用相对平衡的选择了。如果还不够,就只能按Bit算,这个死慢。 //amo73@126.com//直接计算CRC32
//常用简式:0xEDB88320——RAR,ZIP所使用
u32 Calculate_CRC32_Direct(u32 CRC32, //CRC32初值
u8*Buff, //数组
u32 Len) //数组长度
{
u32 i;
CRC32 = ~CRC32;
while(Len--)
{
for(i=0;i<8;i++)
{
if(CRC32 & 1)
CRC32 = (CRC32 >> 1) ^ 0xEDB88320;
else
CRC32 = (CRC32 >> 1);
if((*Buff) & (1<<i))
CRC32 ^= 0xEDB88320;
}
Buff++;//下一个字节
}
return (CRC32 ^ (~0L));
}
示例:
char *test_array = "asdfasdfasdfasdfasdfasdfasdf";
u32 CRC32 = Calculate_CRC32_Direct(0, //符合标准的话,初值必须是0。自定义的话就无所谓了
test_array, //数组
strlen(test_array)); //数组长度 这个函数适合用在资源较少的MCU上。
还有一个最大的优点是可以分段计算(例如串口接收,每收一段数据就校验一段,不用开辟很大的缓冲区),甚至逐字节计算!
示例:
u8 buff={……};
u32 CRC32 = 0;//符合标准的话,初值必须是0。自定义的话就无所谓了
//计算第一段:
CRC32 = Calculate_CRC32_Direct(CRC32, //上一次的计算结果
buff+0, //数组
30); //数组长度
//计算第二段:
CRC32 = Calculate_CRC32_Direct(CRC32, //上一次的计算结果
buff+30, //数组
70); //数组长度 学习一下 mhw 发表于 2014-4-15 16:23
//amo73@126.com
//直接计算CRC32
//常用简式:0xEDB88320——RAR,ZIP所使用
神一般的存在,多谢大神,有用
页:
[1]