аватар question@mail.ru · 01.01.1970 03:00

Байты - перевод из строки

data = ""Hello"".encode(""utf-8"") # перевод в байты

не могу разобраться в байтах... как бы я не старался, Python мне выдает b'Hello'... как мне получить исходные байты этой строки?

Если попробовать с кириллицей, то все получается:

data = ""Привет"".encode(""utf-8"") # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

или я не имею представления о байтах? объясните пожалуйста

аватар answer@mail.ru · 01.01.1970 03:00

Как b'Hello' так и b'\xd0\x9f\xd1\x80...' принадлежат к одному типу bytes.

b'Hello' == b'\x48\x65\x6c\x6c\x6f'. Байты, которые соответствуют печатаемым ascii символам (0x20..0x7e), по умолчанию показаны как эти символы в текстовом представлении repr(data) -- синтаксис, используемый для bytes-конcтант в исходном коде Питона (eval(repr(data)) == data).

Использование символов для некоторых байтов вместо шестнадцатеричных кодов может вводить в заблуждение (как в этом случае). Легко :

>>> b'Hello'.hex()'48656c6c6f'

Мотивация по использованию b'Hello' вместо b'\x48\x65\x6c\x6c\x6f' могла быть связана с тем, что многие популярные протоколы такие как HTTP свободно смешивают текст (закодированный в ascii-совместимой кодировке) и двоичные данные. Поэтому использование символов вместо hex-кодов может помочь при отладке.

Недостаток использования b'Hello' вместо b'\x48\x65\x6c\x6c\x6f' состоит в том что люди смешивают понятия текста (Юникодные строки) и двоичных данных (байтов), что ведёт к путанице и в итоге . Что было особенно остро на Питоне 2, где str = bytes. See .

Без явного указания кодировки, последовательность байтов (bytes объект) является просто набором чисел. Последовательность байтов становится текстом только, если байты декодированы, используя подходящую кодировку:

unicode_text = bytestring.decode(character_encoding)

Последние

Похожие