滚动计算文件CRC32时,如何单独获取各块的CRC32值?
CRC32分块计算与反向推导问题
我采用滚动方式计算文件内容的CRC32值,若文件分为A、B、C三个块,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时,我可以按上述方式计算CRC32(该值会用于服务器验证),但读取操作通常只针对特定块,因此我希望在写入时就能跟踪每个单独块的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值,再借助类似zlib的crc32_combine()函数来得到整个文件的CRC32值。
内容的提问来源于stack exchange,提问作者srai
相关产品推荐
相关产品推荐

