Comportement incohérent de int.to_bytes ()
Quand j'écris:
expint = 34614
expint = expint.to_bytes(2,'big')
J'obtiens une valeur de expint = b '\ x876' au lieu de b '\ x87 \ x36' (le 3 est manquant et le format semble incorrect). Cependant, quand j'ai essayé la même chose avec expint = 65418, j'ai obtenu le résultat correct, b '\ xff \ x8a'. Cela pourrait-il être un bogue dans l'interpréteur ou dans d'autres outils que j'utilise? J'utilise Python 3.7 dans Visual Studio 2017.
Réponses
Cela n'a rien à voir avec int.to_bytes()
, et tout à voir avec le bytes
type lui-même.
J'obtiens une valeur de expint = b '\ x876' au lieu de b '\ x87 \ x36'
Cette plainte n'a aucun sens, car b'\x876'
et b'\x87\x36'
sont la même chose :
>>> b'\x87\x36'
b'\x876'
>>> b'\x87\x36' == b'\x876'
True
bytes
La représentation d' un objet n'est pas simplement un vidage hexadécimal. La grammaire des chaînes d'octets permet de nombreuses autres options, pour des raisons historiques (c'est-à-dire parce que dans 2.x on prétendait qu'elles pouvaient représenter du texte). La représentation canonique (c'est-à-dire celle produite par Python lorsque vous print
créez une instance) n'utilise les \x
échappements de style qu'en dernier recours.
En ASCII, l'octet avec valeur 0x36
est mappé sur le symbole 6
. (Encore une fois: nous avions l'habitude de prétendre que nous pouvions représenter le texte de cette façon. Et si nous n'avons affaire qu'à l'anglais plus une petite sélection de langues européennes et que nous pouvons choisir la langue européenne avec laquelle nous traitons à tout moment, nous pouvons trier -de s'en tirer aussi.)