/ / Verschiedene Ganzzahlen, die von derselben Python-Bytefolge abgeleitet werden - Python, Binär, Python-2.7, Hex, Bytearray

Unterschiedliche Ganzzahlen, die von derselben Python-Byte-Zeichenfolge abgeleitet sind - Python, Binär, Python-2.7, Hex, Bytearray

>>> import binascii, struct
>>> foo_hex = "b1e92555"
>>> foo_bin = binascii.unhexlify(foo_hex)
>>> int(foo_hex, 16)
2984846677
>>> struct.unpack("i", foo_bin)[0]
1428548017

Warum unterscheiden sich diese Zahlen? Welche Methode ist richtig und wie kann die andere geändert werden, um korrekt zu sein?

Antworten:

4 für die Antwort № 1

struct interpretiert den Wert während der Verwendung der Little-Endian-Notation unhexlify und int(.., 16) interpretiert es als Big-Endian-Ganzzahl ohne Vorzeichen.

Benutzen < oder > um das Endergebnis Ihrer Eingabe festzulegen und verwenden Sie I um es als signiertes int zu interpretieren:

>>> struct.unpack(">I", foo_bin)[0]
2984846677
>>> struct.unpack("<I", foo_bin)[0]
1428548017

Siehe die Abschnitt Byte-Reihenfolge, Größe und Ausrichtung des struct Dokumentationsseite.