Seite 1 von 1

CRC32 Checksumme berechnen

Verfasst: Mittwoch 2. September 2020, 12:49
von tryanderror
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?

Re: CRC32 Checksumme berechnen

Verfasst: Mittwoch 9. September 2020, 16:37
von __blackjack__
@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?

Re: CRC32 Checksumme berechnen

Verfasst: Donnerstag 10. September 2020, 14:25
von tryanderror
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/

Re: CRC32 Checksumme berechnen

Verfasst: Donnerstag 10. September 2020, 14:29
von Sirius3
Ich dachte, das soll eine Spielerei sein. Du willst das wirklich einsetzen?
Dann nimm doch die Funktion aus der Standardbibliothek: zlib.crc32

Re: CRC32 Checksumme berechnen

Verfasst: Donnerstag 10. September 2020, 14:51
von __blackjack__
@Sirius3: Geht aber nur wenn man *diese* CRC32-Implememtierung haben will. Man kann beispielsweise weder den Ausgangswert noch das Polynom angeben.