Comportamento inconsistente de int.to_bytes ()

Nov 29 2020

Quando escrevo:

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

Obtenho um valor de expint = b '\ x876' em vez de b '\ x87 \ x36' (falta o 3 e o formato parece incorreto). No entanto, quando tentei o mesmo com expint = 65418, obtive o resultado correto, b '\ xff \ x8a'. Pode ser um bug no intérprete ou em outras ferramentas que estou usando? Estou usando Python 3.7 no Visual Studio 2017.

Respostas

2 KarlKnechtel Nov 29 2020 at 20:32

Isso não tem nada a ver com int.to_bytes(), e tudo a ver com o bytespróprio tipo.

Recebo um valor de expint = b '\ x876' em vez de b '\ x87 \ x36'

Essa reclamação não faz sentido, pois b'\x876'e b'\x87\x36' são a mesma coisa :

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

A bytesrepresentação de um objeto não é simplesmente um hex dump. A gramática de cadeias de bytes permite muitas outras opções, por razões históricas (ou seja: porque em 2.x costumávamos fingir que elas poderiam representar texto). A representação canônica (ou seja, aquela produzida pelo Python quando você printuma instância) usa apenas \xescapes de estilo como último recurso.

Em ASCII, o byte com valor 0x36é mapeado para o símbolo 6. (Mais uma vez: costumávamos fingir que poderíamos representar o texto dessa forma. E se apenas tivermos que lidar com o inglês mais uma pequena seleção de idiomas europeus, e pudermos escolher com qual idioma europeu estamos lidando em determinado momento, podemos classificar -de se safar também.)