CRC32 Checksumme berechnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tryanderror
User
Beiträge: 24
Registriert: Mittwoch 19. Februar 2020, 08:30

Hallo,

ich versuche mich gerade daran eine CRC32-Checksumme durch Python berechnen zu lassen. Es könnte gut sein, dass ich das Verfahren hierfür noch nicht ganz verstanden habe. Für den Algo hab ich mich an dem folgenden Beispiel gehalten: https://en.wikipedia.org/wiki/Cyclic_re ... _algorithm

Also habe ich geguckt wie man eine Tabelle erstellt und dann versucht den Rest umzusetzen:

Code: Alles auswählen

def create_table():
    a = []
    for i in range(256):
        k = i
        for j in range(8):
            if k & 1:
                k ^= 0x4C11DB7
            k >>= 1
        a.append(k)
    return a
    
def crc32(bytestream):
    crc_table = create_table()

    crc32 = 0xffffffff

    for byte in range( len(bytestream) ):
        lookup_index = (crc32 ^ byte) & 0xff
        crc32 = (crc32 >> 8) ^ crc_table[lookup_index]

    return crc32

print(hex(crc32(b"1205")))
    
Am ende erhalte ich folgenden Wert: 0x2ce0a3
Um diesen nun zu prüfen habe ich eine Webseite zum Vergleich verwendet (http://www.sunshine2k.de/coding/javascr ... rc_js.html).
Jedoch war das Resultat ein anderes: 0xA7D10A0A

Es ist zu beachten, dass ich hierbei die Custom Funktion mit folgenden Einstellungen verwendet habe:
kein Input reflected und Result reflected
Polynomial: 0x4C11DB7
Initial Value: 0xFFFFFFFF
final Xor Value: 0x00

Steh ich auf dem Schlauch oder hab ich das Thema total falsch verstanden?
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tryanderror: Auf jeden Fall verwendest Du offenbar andere Daten. In Python vier Bytes (0x31 0x32 0x30 0x35) und auf der Webseite zwei Bytes (0x12 0x05), denn nur dann bekommt man dort 0xA7D10A0A als Ergebnis. Bei den gleichen vier Bytes wie in Python allerdings auch ein anderes Ergebnis als in Python: 0xD0BF86CE

Die Webseite gibt ja auch die Tabelle aus — hast Du die mal mit Deinen Werten verglichen?
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
tryanderror
User
Beiträge: 24
Registriert: Mittwoch 19. Februar 2020, 08:30

Hallo, ich konnte das Problem nicht auf meine weise lösen. Du hattest recht, die Tabellen sind ungleich. Da ich keine weitere Zeit dafür aufbringen kann habe ich ein fertiges Modul verwendet, welches viele Möglichkeiten bietet.
Sollte jemand auch das gleiche Problem haben, empfehle ich das Modul crcengine: https://pypi.org/project/crcengine/
Sirius3
User
Beiträge: 18224
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich dachte, das soll eine Spielerei sein. Du willst das wirklich einsetzen?
Dann nimm doch die Funktion aus der Standardbibliothek: zlib.crc32
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Geht aber nur wenn man *diese* CRC32-Implememtierung haben will. Man kann beispielsweise weder den Ausgangswert noch das Polynom angeben.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten