Inkonsistentes Verhalten von int.to_bytes ()

Nov 29 2020

Wenn ich schreibe:

expint = 34614  
expint = expint.to_bytes(2,'big')

Ich erhalte den Wert expint = b '\ x876' anstelle von b '\ x87 \ x36' (die 3 fehlt und das Format scheint falsch zu sein). Als ich jedoch dasselbe mit expint = 65418 versuchte, erhielt ich das richtige Ergebnis, b '\ xff \ x8a'. Könnte dies ein Fehler im Interpreter oder in anderen Tools sein, die ich verwende? Ich verwende Python 3.7 in Visual Studio 2017.

Antworten

2 KarlKnechtel Nov 29 2020 at 20:32

Dies hat nichts int.to_bytes()mit dem bytesTyp selbst zu tun .

Ich erhalte den Wert expint = b '\ x876' anstelle von b '\ x87 \ x36'

Diese Beschwerde macht keinen Sinn, weil b'\x876'und b'\x87\x36' ist das gleiche :

>>> b'\x87\x36'
b'\x876'
>>> b'\x87\x36' == b'\x876'
True

Ein bytesObjekt der Darstellung ist nicht einfach ein Hex - Dump. Die Grammatik von Byte-Strings erlaubt aus historischen Gründen viele andere Optionen (dh: weil wir in 2.x so getan haben, als könnten sie Text darstellen). Die kanonische Darstellung (dh die von Python als printInstanz erzeugte ) verwendet nur \xStil-Escape-Zeichen als letzten Ausweg.

In ASCII wird das Byte mit dem Wert 0x36dem Symbol zugeordnet 6. (Nochmals: Früher haben wir so getan, als könnten wir Text auf diese Weise darstellen. Und wenn wir uns nur mit Englisch und einer kleinen Auswahl europäischer Sprachen befassen müssen und auswählen können, mit welcher europäischen Sprache wir uns zu einem bestimmten Zeitpunkt befassen, können wir sortieren -von auch damit durchkommen.)