#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')]
Комментариев нет:
Отправить комментарий