crcmod的xorOut参数与手动异或的行为不一致
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
。