我一直試圖讓我的頭繞過CRC32計算沒有太多成功,我似乎得到的值與我應該得到的值不匹配。在Python中無需使用庫的CRC32計算
我知道Python具有能夠生成這些校驗和的庫(即zlib和binascii),但由於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
的binascii和zlib計算同意在那裏作爲我的一個沒有。我相信計算的字節表是正確的,因爲我已將它與網上可用的示例進行了比較。所以這個問題必須是每個字節計算的例程,任何人都可以指向正確的方向?
在此先感謝!
您先生是天賜之物,非常感謝您的快速回復和解決方案! – Cooper
@Cooper不用擔心。我對我的調整不是100%信心(由於混合算術和按位運算)。它似乎正確地完成了這項工作,但我有點擔心它會在某些情況下給出錯誤的答案。 OTOH,我只是在通過''\ xff \ xff \ xff \ xff''時檢查它返回'ffffffff',所以這是一個好兆頭。 :) –
@Cooper經過那些額外的測試後,我的信心增加了。 :)如果它爲任何輸入返回錯誤的結果,我會很驚訝。 –