当我试图用块计算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结果作为参数。
输出:
crc=9290bbfc
crc_chunk1=06dcaed5
crc_chunk1+2=d5800060为什么crc != crc_chunk1+2
我想把这些块组合起来,结果是一样的。
谢谢。
发布于 2021-12-07 03:40:30
unsigned int crc32(const unsigned char *buf, int len, unsigned int init)
{
unsigned int crc = init;
...
return crc ^ 0xffffffff;
}上面的函数从init开始,然后用0xffffffff对结果进行XOR
如果要将结果反馈给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将其异或。
https://stackoverflow.com/questions/70254409
复制相似问题