我正在以滚动的方式计算文件内容的CRC32。如果文件包含3个块ABC,则CRC32是线性计算的CRC(CRC(CRC(A, 0xffffffff), B), C)。这是通过如下代码完成的:
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多项式工作原理的有限理解,
A mod G = CRC1
AB mod G = CRC2如果我想要B的CRC32,我认为以下几点应该可以做到:
(CRC2 - CRC1) mod G
or
(CRC2 ^ CRC1) mod G 当然,下面的代码不起作用。
uint32_t
crc32sw_diff(uint32_t crc1, uint32_t crc2)
{
uint32_t delta = crc1 ^ crc2;
return crc32(&delta, 4, 0xffffffff);
}其他选项可能是计算单个块的CRC32,并将其与类似于联合()的内容组合起来,以获得整个文件的CRC32。
发布于 2022-10-18 03:25:33
https://stackoverflow.com/questions/74089341
复制相似问题