块中的 CRC 计算
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结果作为参数
输出:
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;
}
上面的函数以init
开始,然后将结果与0xffffffff
异或
如果您要将结果反馈给 crc32
,那么您必须再次异或。第二个 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
异或。
我在尝试分块计算 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?
我想合并这些块以便结果相同。
谢谢。
unsigned int crc32(const unsigned char *buf, int len, unsigned int init)
{
unsigned int crc = init;
...
return crc ^ 0xffffffff;
}
上面的函数以init
开始,然后将结果与0xffffffff
如果您要将结果反馈给 crc32
,那么您必须再次异或。第二个 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
异或。