[英]CRC calculation in chunks
尝试分块计算 crc 时遇到问题。
这是代码:
unsigned int crc32(const unsigned char *buf, int len, unsigned int init){
unsigned int crc = init;
while (len--){
crc = (crc << 8) ^ crc32_table[((crc >> 24) ^ *buf) & 255];
buf++;
}
return crc ^ 0xffffffff;
}
int main(){
unsigned char buf[10]={0,1,2,3,4,5,6,7,8,9};
printf("crc=%08x\n",crc32(buf,10,0xffffffff));
unsigned int crc = crc32(buf,5,0xffffffff);
printf("crc_chunk1=%08x\n",crc);
crc = crc32(buf+5,5,crc);
printf("crc_chunk1+2=%08x\n",crc);
}
第一个 crc 调用计算所有 10 个字节,
第二个计算前5个字节的crc
第三个计算最后 5 个字节的 crc,但将前 5 个字节的 crc 结果作为参数
Output:
crc=9290bbfc
crc_chunk1=06dcaed5
crc_chunk1+2=d5800060
为什么crc != crc_chunk1+2 ?
我想组合这些块,所以结果是一样的。
谢谢。
unsigned int crc32(const unsigned char *buf, int len, unsigned int init)
{
unsigned int crc = init;
...
return crc ^ 0xffffffff;
}
上面的 function 以init
开头,然后将结果与0xffffffff
异或
如果您要将结果反馈给crc32
,那么您必须再次进行 XOR。 第二个 XOR 将撤消在crc32
中完成的转换
//one time
unsigned int crc;
crc = crc32(buf, 10, 0xffffffff);
printf("%08x\n", crc);
//two times
crc = crc32(buf, 5, 0xffffffff);
crc ^= 0xffffffff; //undo previous XOR
crc = crc32(buf + 5, 5, crc); //feed back in
printf("%08x\n", crc);
或更改return crc ^ 0xffffffff;
return crc;
并在打印前将其与0xffffffff
异或。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.