Почему bytes.fromhex() выдает показанный результат?

#python

#python

Вопрос:

Мне было интересно, почему этот hex: bytes.fromhex("34 FF FA A3 A5") выдает вывод : b'4xffxfaxa3xa5' . Почему x исчезло, не так ли x34 ?

Ответ №1:

Вот как bytes repr работают s; когда байт имеет порядковое значение, соответствующее печатному символу ASCII, он представляется как символ ASCII, а не x escape-код. Вы можете создать bytes с любой формой ( b'4' == b'x34' is True ; они выдают точно такое же bytes значение), но он выбирает отображение ASCII, чтобы сделать байтовые строки, которые являются ASCII, более удобочитаемыми (и сделать многие repr s короче).

Ответ №2:

Python пытается напечатать хорошо выглядящий эквивалент. В вашем случае мы имеем: '0x34'= hex(ord("4")) , что означает, что целое число в Юникоде, представляющее 4 в шестнадцатеричном формате, равно ‘0x34’. Попробуйте это в вашей консоли: print ("x09") . Это потому, что x09 в шестнадцатеричном формате представляет t .

Комментарии:

1. Какой-то ужасный тестовый пример; печать символа табуляции, за которым сразу следует новая строка, будет неотличима от печати только новой строки большую часть времени.

2. Он показывает, как python действует при печати строк. Дело не в неразличимости.

3.За исключением того, что вы печатаете строку, а не ее repr (или repr bytes объекта). Таким образом, вы на самом деле не видите t , вы увидите (или, точнее, не увидите) распечатанную буквенную вкладку. Проблема в том, что вы придумали демонстрацию, которая практически ничего не демонстрирует.

4. В том-то и дело, что вы не видите ничего, кроме того, что было напечатано » x09″, и ожидалось, что это будет видно в консоли!

5. Хорошо, конечно, но чем это отличается от печати 'x34' (как в примере OP) и просмотра 4 ? Или использование какого-либо другого печатного символа, чтобы вы знали print , что действительно произошло, а не только то, что что-то пошло не так?