Несогласованное поведение int.to_bytes ()
Когда я пишу:
expint = 34614
expint = expint.to_bytes(2,'big')
Я получаю значение expint = b '\ x876' вместо b '\ x87 \ x36' (3 отсутствует и формат кажется неправильным). Однако, когда я попробовал то же самое с expint = 65418, я получил правильный результат b '\ xff \ x8a'. Может быть, это ошибка интерпретатора или других инструментов, которые я использую? Я использую Python 3.7 в Visual Studio 2017.
Ответы
Это не причем int.to_bytes(), а все связано с bytesсамим шрифтом.
Я получаю значение expint = b '\ x876' вместо b '\ x87 \ x36'
В этой жалобе нет никакого смысла, потому что b'\x876'и b'\x87\x36' это одно и то же :
>>> b'\x87\x36'
b'\x876'
>>> b'\x87\x36' == b'\x876'
True
Представление bytesобъекта - это не просто шестнадцатеричный дамп. Грамматика байтовых строк допускает множество других опций по историческим причинам (например, потому что в 2.x мы привыкли делать вид, что они могут представлять текст). Каноническое представление (то есть то, которое создается Python при printсоздании экземпляра) использует \xэкранирование стиля только в крайнем случае.
В ASCII байт со значением 0x36отображается на символ 6. (Опять же: мы привыкли делать вид, что можем представить текст таким образом. И если нам нужно иметь дело только с английским и небольшим выбором европейских языков и мы можем выбрать, с каким европейским языком мы имеем дело в любой момент времени, мы можем отсортировать - тоже сойдет с рук.)