Comportamiento inconsistente de int.to_bytes ()

Nov 29 2020

Cuando yo escribo:

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

Obtengo un valor de expint = b '\ x876' en lugar de b '\ x87 \ x36' (falta el 3 y el formato parece incorrecto). Sin embargo, cuando intenté lo mismo con expint = 65418 obtuve el resultado correcto, b '\ xff \ x8a'. ¿Podría ser un error en el intérprete o en otras herramientas que estoy usando? Estoy usando Python 3.7 en Visual Studio 2017.

Respuestas

2 KarlKnechtel Nov 29 2020 at 20:32

Esto no tiene nada que ver int.to_bytes()y tiene que ver con el bytestipo en sí.

Obtengo un valor de expint = b '\ x876' en lugar de b '\ x87 \ x36'

Esta denuncia no tiene ningún sentido, porque b'\x876'y b'\x87\x36' son lo mismo :

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

bytesLa representación de un objeto no es simplemente un volcado hexadecimal. La gramática de las cadenas de bytes permite muchas otras opciones, por razones históricas (es decir, porque en 2.x solíamos pretender que podían representar texto). La representación canónica (es decir, la producida por Python cuando tienes printuna instancia) solo usa \xescapes de estilo como último recurso.

En ASCII, el byte con valor 0x36se asigna al símbolo 6. (Nuevamente: solíamos fingir que podíamos representar el texto de esta manera. Y si solo tenemos que trabajar con el inglés más una pequeña selección de idiomas europeos, y podemos elegir con qué idioma europeo estamos tratando en un momento dado, podemos ordenar -de salirse con la suya también.)