Comportement incohérent de int.to_bytes ()

Nov 29 2020

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

2 KarlKnechtel Nov 29 2020 at 20:32

Cela n'a rien à voir avec int.to_bytes(), et tout à voir avec le bytestype 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

bytesLa 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 printcréez une instance) n'utilise les \xéchappements de style qu'en dernier recours.

En ASCII, l'octet avec valeur 0x36est 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.)