块中的 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 异或。