首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRC块计算

CRC块计算
EN

Stack Overflow用户
提问于 2021-12-07 02:56:10
回答 1查看 358关注 0票数 -1

当我试图用块计算crc时,我遇到了一个问题。

这是代码:

代码语言:javascript
复制
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结果作为参数。

输出:

代码语言:javascript
复制
crc=9290bbfc
crc_chunk1=06dcaed5 
crc_chunk1+2=d5800060

为什么crc != crc_chunk1+2

我想把这些块组合起来,结果是一样的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-07 03:40:30

代码语言:javascript
复制
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中完成的转换

代码语言:javascript
复制
//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将其异或。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70254409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档