Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

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

#python #python_3x #byte


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'


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


Ответы

Ответ 1



Как 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). Использование символов для некоторых байтов вместо шестнадцатеричных кодов может вводить в заблуждение (как в этом случае). Легко получить hexdump, если необходимо: >>> 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 Stop displaying elements of bytes objects as printable ASCII characters in CPython 3 [python-ideas mailing list (2014)]. Без явного указания кодировки, последовательность байтов (bytes объект) является просто набором чисел. Последовательность байтов становится текстом только, если байты декодированы, используя подходящую кодировку: unicode_text = bytestring.decode(character_encoding)

Ответ 2



Попробуйте это. Функция ord вернет значение символа в десятеричном коде: text = "Hello world!" [(c, ord(c), hex(ord(c))) for c in text] Результат: [('H', 72, '0x48'), ('e', 101, '0x65'), ('l', 108, '0x6c'), ('l', 108, '0x6c'), ('o', 111, '0x6f'), (' ', 32, '0x20'), ('w', 119, '0x77'), ('o', 111, '0x6f'), ('r', 114, '0x72'), ('l', 108, '0x6c'), ('d', 100, '0x64'), ('!', 33, '0x21')]

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

Отправить комментарий