我一直在试图了解CRC32的计算结果,但没有成功,我得到的值似乎与我应该得到的值不匹配。
我知道Python有能够生成这些校验和的库(即zlib和binasci),但由于CRC功能在micropython上不存在,因此我没有足够的资源来使用它们。
到目前为止,我有以下代码:
import binascii
import zlib
from array import array
poly = 0xEDB88320
table = array('L')
for byte in range(256):
crc = 0
for bit in range(8):
if (byte ^ crc) & 1:
crc = (crc >> 1) ^ poly
else:
crc >>= 1
byte >>= 1
table.append(crc)
def crc32(string):
value = 0xffffffffL
for ch in string:
value = table[(ord(ch) ^ value) & 0x000000ffL] ^ (value >> 8)
return value
teststring = "test"
print "binascii calc: 0x%08x" % (binascii.crc32(teststring) & 0xffffffff)
print "zlib calc: 0x%08x" % (zlib.crc32(teststring) & 0xffffffff)
print "my calc: 0x%08x" % (crc32(teststring))
然后我得到以下输出:
binascii calc: 0xd87f7e0c
zlib calc: 0xd87f7e0c
my calc: 0x2780810c
binasci和zlib的计算与我的不一致。我相信计算的字节表是正确的,因为我已经将它与网络上可用的示例进行了比较。所以问题必须是计算每个字节的例程,有人能告诉我正确的方向吗?
提前谢谢!
我没有仔细查看您的代码,因此无法确定错误的确切来源,但您可以轻松地对其进行调整以获得所需的输出:
输出
这里还有几个测试,验证经过调整的
crc32
是否给出了与binascii.crc32
相同的结果。输出
如注释中所讨论的,原始代码中的错误源于此CRC-32算法反转初始CRC缓冲区,然后反转最终的缓冲区内容。所以
value
初始化为0xffffffff
,而不是零,我们需要返回value ^ 0xffffffff
,它也可以写为~value & 0xffffffff
,即反转value
,然后选择结果的低阶32位。相关问题 更多 >
编程相关推荐