Ich habe versucht, den Kopf über CRC32-Berechnungen ohne viel Erfolg zu bekommen, die Werte, die ich zu bekommen scheinen, stimmen nicht überein, was ich bekommen sollte.CRC32-Berechnung in Python ohne Verwendung von Bibliotheken
Ich bin mir bewusst, dass Python Bibliotheken, die in der Lage, diese Prüfsummen (zlib und binascii) erzeugen kann, aber ich habe nicht den Luxus, sie zu verwenden, da die CRC-Funktionalität nicht auf dem Micropython existieren.
Bisher habe ich den folgenden Code:
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))
Dann bekomme ich die folgende Ausgabe:
binascii calc: 0xd87f7e0c
zlib calc: 0xd87f7e0c
my calc: 0x2780810c
Die binascii und zlib Berechnungen stimmen, wo, wie mein man nicht tut. Ich glaube, die berechnete Byte-Tabelle ist korrekt, da ich sie mit im Netz verfügbaren Beispielen verglichen habe. Das Problem muss also die Routine sein, in der jedes Byte berechnet wird. Kann mir jemand in die richtige Richtung zeigen?
Vielen Dank im Voraus!
Sie sind ein Geschenk des Himmels, vielen Dank für Ihre schnelle Antwort und Lösung! – Cooper
@ Cooper Keine Sorge. Ich bin nicht zu 100% überzeugt von meiner Optimierung (aufgrund der Mischung von Arithmetik mit bitweisen Operationen). Es erscheint _, um die Aufgabe richtig zu machen, aber ich bin ein wenig besorgt, dass es _might_ in einem Eckfall die falsche Antwort geben kann. OTOH, ich habe gerade überprüft, dass es 'ffffffff' zurückgibt, wenn es '' \ xff \ xff \ xff \ xff'' übergeben wurde, also ist das ein gutes Zeichen. :) –
@Cooper Nach diesen zusätzlichen Tests hat mein Vertrauen zugenommen. :) Ich wäre sehr überrascht, wenn es für irgendeine Eingabe das falsche Ergebnis liefert. –