Wie berechne CRC32 mit Python-match online Ergebnisse?
Ich versuche zu berechnen/erzeugen der CRC32 hash einige zufällige Zeichenketten mit Python, aber Sie entsprechen nicht den Werten, die ich generieren von online-Quellen. Hier ist, was ich mache, auf meinem PC,
>>> import binascii
>>> binascii.crc32('hello-world')
-1311505829
Anderen Ansatz,
>>> import zlib
>>> zlib.crc32('hello-world')
-1311505829
Die Tatsache, dass die oben genannten Ergebnisse sind identisch, sagt mir, dass ich rufe die Funktion korrekt. Aber, wenn ich mich im folgenden online-Quellen,
- http://www.lammertbies.nl/comm/info/crc-calculation.html
- http://crc32-checksum.waraxe.us/
- http://www.md5calc.com/ (wählen Sie CRC32B aus der drop-down)
Für den string "hello-world" - Sie alle geben den gleichen Wert = b1d4025b
Weiß jemand, was ich tun muss, um passende Ergebnisse?
Als ich getippt diese Frage ist mir eingefallen, dass ich vielleicht brauchen, um zu konvertieren, meine Python-Ergebnis in hex,
>>> hex(zlib.crc32('hello-world'))
'-0x4e2bfda5'
Leider, das hat nicht geholfen, entweder. 🙁
hello-world
, was tun Sie erwarten, dass die CRC32?Die richtige CRC32 von
hello-world
ist 0xb1d4025b
als unsigned int -0x4e2bfda5
als signed int. Er eindeutig nicht wissen, wie diese beiden Werte zusammenhängen, daher die Frage.InformationsquelleAutor chronodekar | 2015-05-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python ist dabei eine vorzeichenbehaftete 32-bit-CRC.
Diese Websites tun eine vorzeichenlose 32-bit-CRC.
Werden die Werte der gleichen Weise, wie Sie sehen können, aus diesem:
Einen schnellen Weg, um konvertieren von 32-bit signed 32-bit unsigned ist:*
Oder in hex:
& 0xFFFFFFFF
oder% 0x100000000
oder& (2**32-1)
oder% (2**32)
und so weiter sind alle gleichwertige Möglichkeiten, das gleiche zu tun-bit-twiddling; kommt nur auf die eine, die Sie finden die meisten lesbar.* Dies funktioniert nur bei Sprachen, die über integer-division, wie zum Beispiel Python (
-3 //2 == -2
); in Sprachen, die abgeschnitten integer-division, wie Java (-3 /2 == -1
), werden Sie noch am Ende mit einer negativen Zahl. Und in Sprachen, die nicht einmal verlangen, dass die division und mod gehen gut zusammen, wie C, alle Wetten sind aus, aber in C, würde nur Stimmen die bytes, die Art, die Sie wollen...Danke; behoben.
Python is doing a signed 32-bit CRC
Nur eine Anmerkung: in Python ist3, wurde dies geändert, so dass es läuft unsigned CRC. Siehe die docs.Dies hängt nicht davon ab, wie die Teilung geschehen ist, aber die definition von
%
. In den meisten Sprachen, ist es definiert als:x % y == x - floor(x / y) * y
("dasselbe Vorzeichen wie divisor", was Python macht. So positiv, wie2**32
ist positiv)x % y == x - truncate(x / y) * y
("gleiche Zeichen als Dividende") oderx % y == x - round_towards_zero(x / y)
("positiv modulo"). In der Regel ist dies das gleiche wie /, aber nicht immer. Immer positive integer-division in anderen Sprachen, würden Sie so etwas tun:def positive_mod(a, b): return ((a % b) + b) % b
. Siehe en.wikipedia.org/wiki/Modulo_operationInformationsquelleAutor abarnert
zlib.crc32-Dokumentation schlägt mit den folgenden Ansatz "zu generieren, die den gleichen numerischen Wert über alle Python-Versionen und Plattformen".
Das Ergebnis ist
0xb1d4025b
als erwartet.Ich bin neugierig, warum dies anders sein würde, auf allen Plattformen. Wäre nicht Python Verhalten identisch sein über das board? (ignorieren 2.x-und 3.x Unterschiede)
Ich bin sicher, es würde nicht allzu schwer sein, zu finden in der Quelle; wenn Sie nicht finden können, es sich selbst, können Sie erstellen eine neue Frage. Aber von einem schnellen test, negativ auf Mac 2.7 und Linux 2.7, positiv auf Windows 2.7 und Mac 3.5, also ich bin mir ziemlich sicher, dass es ein Plattform-Problem, nicht ein 2-vs.-3-Ausgabe. Oder vielleicht ist es eine Kombination der beiden. (Egal, es hilft nicht die OP, deren Python-eindeutig nicht unterzeichnet, crc32, genau wie mein Mac 2.7 nicht...)
Danke, behoben.
Ich habe nicht gefunden eine klare Antwort, dass in der Python-Dokumentation, also habe ich bearbeitet meine Antwort, das gleiche Verhalten in allen Python-Versionen und Plattformen.
InformationsquelleAutor Alexey
Scheint es, dass python ist die Rückgabe eine Ganzzahl (also die negative Zahl), während die anderen die sind der Rückgabe eine Ganzzahl.
Habe ich versucht, mit einem E-Modul mit 2^32, und es gab den gleichen Wert wie diese Seiten.
InformationsquelleAutor chw21