Взгляните на это:
>>> b'\x35\xfe\x01\x00'
b'5\xfe\x01\x00'
>>> b'\x35\xfe\x01\x00' == b'5\xfe\x01\x00'
True
>>> b'\x35'
b'5'
>>> b'\x35' == b'5'
True
>>> b'\x35'[0]
53
>>> b'5'[0]
53
И b'\x35'
, и b'5'
имеют одинаковое значение байта 0x35. Просто они оба являются двумя разными представлениями одного и того же значения.
Очень часто существует несколько способов записи буквального значения для одного и того же фактического значения. Например, десятичное значение 53 может быть представлено с помощью 53
, 0x35
, 0o65
или 0b110101
. Это все числовые литералы для одного и того же объекта int
.
Точно так же b'\x35
и b'5'
— это всего лишь два литерала строки байтов для одного и того же объекта байтов.
Когда вы печатаете объекты, Python внутренне вызывает str()
для объектов, чтобы убедиться, что объекты можно распечатать. Для объектов bytes это означает, что возвращается строковый литерал bytes. И поскольку существует несколько способов представления этого объекта, Python должен выбрать одно представление.
Для байтов правило заключается в том, что всякий раз, когда байт может быть представлен как печатный символ ASCII, этот символ используется вместо управляющей последовательности. Как правило, это позволяет вам читать байтовые строки, представляющие данные ASCII. Например, b'foo'
намного читабельнее, чем b'\x66\x6f\x6f'
(но означает одно и то же).
Если вам нужно получить согласованное строковое представление объекта bytes, вы можете явно преобразовать его в шестнадцатеричную строку. Например, позвонив по номеру bytes.hex
:
>>> b'5\xfe\x01\x00'.hex()
'35fe0100'
Конечно, теперь это уже не двоичные данные, а строка, представляющая двоичные данные, закодированные как шестнадцатеричная строка. Если вы хотите на самом деле передать данные, например, по сети или внутри файла, вы захотите сохранить его как объект bytes
и просто использовать его.
person
poke
schedule
09.08.2018