Я старался не упускать из виду вычисления CRC32 без особых успехов, ценности, которые, как мне кажется, не соответствуют тому, что я должен получить.Расчет CRC32 в Python без использования библиотек
Я знаю, что у Python есть библиотеки, способные генерировать эти контрольные суммы (а именно zlib и binascii), но у меня нет роскоши быть в состоянии их использовать, поскольку функции CRC не существуют на микропитоне.
До сих пор у меня есть следующий код:
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 расчеты согласны, где, как мой один не делает. Я считаю, что вычисленная таблица байтов верна, поскольку я сравнил ее с примерами, доступными в сети. Таким образом, проблема должна быть обычной, когда вычисляется каждый байт, может ли кто-нибудь указать мне правильное направление?
Заранее благодарен!
Вы, сэр, Godsend, большое спасибо за ваш быстрый ответ и решение! – Cooper
@Cooper Не стоит беспокоиться. Я не уверен на 100% от моей настройки (из-за смешивания арифметики с побитовыми операциями). Это _appears_, чтобы правильно выполнить работу, но я немного обеспокоен тем, что это _might_ дает неправильный ответ в некотором краевом случае. OTOH, я только что проверил, что он возвращает 'ffffffff' при передаче' '\ xff \ xff \ xff \ xff'', так что это хороший знак. :) –
@Cooper После этих дополнительных тестов моя уверенность увеличилась. :) Я был бы удивлен, если он вернет неверный результат для любого ввода. –