MicroProger
@MicroProger
Работает - не трогай

Как конвертировать байты(шестнадцатеричный код) в string в Python?

Искал в интернете достаточно долго. Было много вариантов, но выдавало ошибку.
Вот, что я уже пробовал:
1.
x = b'\x01'
print ('{:b}'.format(x.decode('utf-8')))

Получил:
Unknown format code 'b' for object of type 'str'
2.
x = b'\x01'
print(chr(int(x[8:], 2)))

Получил:
invalid literal for int() with base 2: b''
3.
x = b'\x01'
print((x).to_bytes(1, byteorder='big'))

Получил:
'bytes' object has no attribute 'to_bytes'
Возможно, я совершаю какие-либо ошибки, но я их не вижу. Нужна помощь, можете подсказать, какой есть способ?

UPD:
Я нашел способ, но он почему-то работает только с маленьким кодом:
import codecs
x = b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
print(bytes.decode(x, encoding='utf-8'))

Получил:
Привет

С большим кодом получается вот такая вот ошибка:
File "C:\Users\user\Desktop\StillerTelegram\testBynar.py", line 2
    15\xb5\xedqh\xd8L\xea\xd3\xbc\xed\x9e\x86\x8e\xad9\xac0\x9e[;\x00\x1bfU=\xdb\t\xbdr\xbb\xe6x\xb5\xd2,\x14\xc7\x16\xdc\xe9D]\xfe\xbe\xde\xff\xed\x00\xf0\xb1Z\xa5\xa0\x93\xe6x\x0c\x00\xd9\xdb\xeb\x16Lr\xe2\xe0\xcf)H\xab\x7f\x01^A\x92\x89N\xee\xc5\x85\x8ac\xaf\x14\xa2\xbf\xbc\xf9\xaf\x02x\x11\rP\xc9\x19m\xa8\x01\xc0`\xcfX\x8bO\xca\xf0\xcb5\xc7m\x0b \x9f\x03\xd0\xf2\xa0\xd1\x16\xb9R\xccHPS\x04,\x12\xe8\xa3O\xb2\x1b\xe4\xd8\x02\x19-\xa8\xf2d>\xfc\xac5=\x86jC2i\x8e\'\x01#\xb3\xce\xd0\x1ci\xd8\x1c\xc0\x8dBi\r\xb4g>\r\x1eH%\rK\xc1\xf4\xe4N\xf9\\^(?\x07\x1d-\xf8\xcd\xd2\x7f3\xf5_d~\xb9\xe6x\xe9q=#\xc8t\xb5\x82\xcf\x0b2!JZ\x83s\x01P\x16f\x8a\x99C\xae\x90\xf7\x7f\x93\xf3\x90\xa4\x9c\x1f\xe49gQ\xce\x95)Y\xc99\xaf\x11\xa8\xd5\xfe\xbb\xcc\xbf\x8f\xea\x99CS_\xce3\xcf\xa16p\xf4U\x88G\x12Jq~2\xe9\x90X\xa6\x0e\xf4\x9f\x95\x10\x89\xa2\x00Q\x0b\x10cG\xa6\xac-\xa7\xd4\x0b\xbcNl\xafo\x13\xf1<\x02\x10 F\x15\x9a\xa3!\x11#\xb3\'\x91\x9bkK\xa0`\xaeO5\xc7\x9b\x14M-\x9c\x87n-e\x9dE\xa6\xe1\xf6F\xcd\xc1'
(value error) invalid \x escape at position 5372
  • Вопрос задан
  • 3243 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
В простейшем случае ты можешь сделать такую табличку

b'\x01' => '01'
b'\xff' => 'ff'

Где одному байту будет соотвествовать 2 символа.

Или можно разбирать 1 байт на 2 части по 4 бита и для каждого из них ставить в соотвествие одну
шестнадцатеричную цифру.

Ну и API-ев богатое множество должно быть.

По поводу твоих экспериментов с utf-8. Там есть запрещенные комбинации байтов. Потому
не любой рандомный массив байтов обязан преобразовываться в символы.
Ответ написан
Vindicar
@Vindicar
RTFM!
Если именно байты, то так:
b = b'\x68\x65\x6c\x6c\x6f'
print(b.decode('ascii'))  # hello

Фокус в кодировке. Если у тебя не только ASCII, то нужно точно знать, в какой кодировке данные. Например, utf-8, или latin-1, или windows-1251. Или ещё какой, их 100500.
А если данные битые, то декодирование не гарантируется.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы