crcmod的xorOut参数与手动异或的行为不一致

1 投票
1 回答
803 浏览
提问于 2025-04-30 11:02

crcmod文档中提到:

“xorOut – 最终值,用来和计算出的CRC值进行异或操作。某些CRC算法会用到这个。默认值是零。”

根据这个描述,我以为把这个参数设置为一个非零的数字(比如0xFFFFFFFF)就相当于先用零作为参数计算CRC值,然后再用^运算符把这个值和那个数字进行异或操作。

但我看到的结果并不是这样。那我哪里想错了呢?这个xorOut参数的实际行为是什么?

下面是我在交互式解释器中直接运行的代码。我原本以为最后一行会返回True。

>>> import crcmod
>>> crc32_func_noxor = crcmod.mkCrcFun(0x104c11db7, initCrc=0, rev=True, xorOut=0)
>>> crc32_func_xor = crcmod.mkCrcFun(0x104c11db7, initCrc=0, rev=True, xorOut=0xffffffff)
>>> crc32_func_noxor('12345678'.decode('hex'))^0xffffffff==crc32_func_xor('12345678'.decode('hex'))
False
暂无标签

1 个回答

3

根据文档的说明:

initCrc – 这是用来开始CRC计算的初始值。这个初始值应该是初始移位寄存器的值,如果使用的是反向算法,就要把它反转,然后再和最终的XOR值进行异或运算。这样做的结果就等于算法对于一个长度为零的字符串应该返回的CRC结果。默认情况下,所有位都被设置为1,因为这个起始值会考虑到前面的零字节。如果从零开始,就会忽略所有前面的零字节。

这意味着如果你不指定initCrc,它会把寄存器初始化为最终的XOR值xorOut。如果你想要的效果是仅仅对结果进行异或运算,那么你可以把initCrc设置为xorOut

撰写回答