>>> 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 № 1struct
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.