繁体   English   中英

块中的 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 结果作为参数

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM