首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >附加块的CRC32

附加块的CRC32
EN

Stack Overflow用户
提问于 2022-10-16 17:33:52
回答 1查看 26关注 0票数 0

我正在以滚动的方式计算文件内容的CRC32。如果文件包含3个块ABC,则CRC32是线性计算的CRC(CRC(CRC(A, 0xffffffff), B), C)。这是通过如下代码完成的:

代码语言:javascript
复制
uint32_t crc32(unsigned char const *buf, uint32_t buf_size, uint32_t crc32) {
     for (int i = 0; i < buf_size; i++)
         crc32 = (crc32 >> 8) ^ table[(crc32 ^ buf[i]) & 0xff];
     return crc32;
 }

即使我同时编写了整个内容ABC,计算上面的CRC (在服务器上验证),读取通常是在一个特定的块上完成的。因此,我想跟踪每个单独的块的CRC32,因为它是写的。

基于我对CRC32多项式工作原理的有限理解,

代码语言:javascript
复制
A mod G  = CRC1
AB mod G = CRC2

如果我想要B的CRC32,我认为以下几点应该可以做到:

代码语言:javascript
复制
(CRC2 - CRC1) mod G  
or
(CRC2 ^ CRC1) mod G 

当然,下面的代码不起作用。

代码语言:javascript
复制
uint32_t
crc32sw_diff(uint32_t crc1, uint32_t crc2)
 {
     uint32_t delta = crc1 ^ crc2;
     return crc32(&delta, 4, 0xffffffff);
 }

其他选项可能是计算单个块的CRC32,并将其与类似于联合()的内容组合起来,以获得整个文件的CRC32。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-18 03:25:33

有关CRC组合的工作方式,请参见这个答案CRC(A) ^ CRC(B)不等于CRC(AB)。但是(对于纯CRCs)使用的符号是ABA的级联消息,然后是B,而0意味着等长消息将全部为零,那么CRC(A0) ^ CRC(0B)等于CRC(AB)

这也意味着CRC(A0) ^ CRC(AB) == CRC(0B)。因为CRC(0B) == CRC(B) (输入零不会改变纯CRC),所以您可以使用来自zlibcrc32_combine()找到它。

因此,crc32_combine(crca, crcab, lenb)将返回crcb

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

https://stackoverflow.com/questions/74089341

复制
相关文章

相似问题

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