组合两个非纯CRC值

问题描述 投票:0回答:1

基于这个答案我理解组合两个块的CRC值背后的原理,考虑到零串的CRC为0并使用线性属性。但在实践中,大多数实现都会向寄存器注入一些初始值,并对最终结果进行补充,以处理前导/尾随 0 的错误插入。因此,1)使用第一个块的 CRC 设置寄存器,2)在第二个块的长度中输入 0,以及 3)对第二个块的 CRC 中的结果进行异或的基本实现不起作用。

看来你需要在步骤3之前“撤消”后调节。

我使用以下 python 程序进行了尝试,该程序在 zlib 库中使用 CRC 实现。

import zlib

def crc_combine(a, b):
     crcA = zlib.crc32(a)
     crcB = zlib.crc32(b)
     crcA0 = zlib.crc32(b'\0' * len(b), crcA ^ 0xffffffff) ^ 0xffffffff
     return crcA0 ^ crcB

 if __name__ == "__main__":
      assert zlib.crc32(b'HelloWorld') == crc_combine(b'Hello', b'World')

组合操作有效,但我想了解为什么?

该库似乎使用 0xffffffff 作为前置/后置条件,因此我将该值用于两个 XOR。如果没有两个 XOR,组合函数就不会做正确的事情,并且断言会失败。据我了解,第一个 XOR 通过在 zlib.crc32() 中用 0xffffffff 初始化 CRC 寄存器来取消,并最终用 crcA 初始化 CRC 寄存器(包括预调节/后调节)。然后它开始输入 0,从而将 CRC 左移。需要与 0xffffffff 进行第二次异或才能撤消 zlib.crc32() 完成的结果的补码。最终结果 crcA0 与 crcB(还包括应用于它的前/后条件)进行异或以获得组合的 CRC 值。

是否需要两个具有 0xffffffffff 的 XOR 才能使“CRCA0 ^ crcB”以纯形式工作?但看起来我们在使用 crcA 初始化的寄存器之后输入 0,这既是前置条件又是后置条件。这有什么直观的解释吗?

python c crc
1个回答
0
投票

combine() 将 B 附加到 A。

crc32 将 CRC 初始化为 0xffffffff,并在计算 CRC 后,将其与 0xffffffff 进行异或。

 crcB = zlib.crc32(b)                                              - crcB has post xor
                                   crcA ^ 0xffffffff               - undoes the post crc xor
        zlib.crc32(b'\0' * len(b), crcA ^ 0xffffffff)              - cycles crc for len(b)
crcA0 = zlib.crc32(b'\0' * len(b), crcA ^ 0xffffffff) ^ 0xffffffff - undoes the post CRC xor
crcA0 ^ crcB                                                       - produces appended crc
© www.soinside.com 2019 - 2024. All rights reserved.