Преобразование байта в строку и обратно правильно в Python3? - PullRequest
0 голосов
/ 07 мая 2018

Учитывая случайный байт (т.е. не только цифры / символы!), Мне нужно преобразовать его в строку и затем обратно в начальный байт без потери информации. Это кажется основной задачей, но я столкнулся со следующими проблемами:

Предполагая, что:

rnd_bytes = b'w\x12\x96\xb8'
len(rnd_bytes)

отпечатков: 4

Теперь, преобразовав его в строку. Примечание: мне нужно установить backslashreplace, так как в противном случае он возвращает «UnicodeDecodeError» или потеряет информацию, устанавливая для него другое значение флага.

my_str = rnd_bytes.decode('utf-8' , 'backslashreplace')

Теперь у меня есть строка. Я хочу преобразовать его обратно в исходный байт (размер 4!):

Согласно ресурсам Python и этому ответу , существуют различные возможности:

conv_bytes = bytes(my_str, 'utf-8')
conv_bytes = my_str.encode('utf-8')

Но len (conv_bytes) возвращает 10.

Я попытался проанализировать результат:

>>> repr(rnd_bytes)
"b'w\\x12\\x96\\xb8'"
>>> repr(my_str)
"'w\\x12\\\\x96\\\\xb8'"
>>> repr(conv_bytes)
"b'w\\x12\\\\x96\\\\xb8'"

Имеет смысл заменить '\\\\'. my_str.replace('\\\\','\\') ничего не меняет. Вероятно, потому что четыре обратных слеша представляют только два. Итак, my_str.replace('\\','\') найдет '\\\\', но приведет к

SyntaxError: EOL при сканировании строкового литерала

из-за последнего аргумента '\'. Это обсуждалось здесь , где возникло следующее предложение:

>>> my_str2=my_str.encode('utf_8').decode('unicode_escape')
>>> repr(my_str2)
"'w\\x12\\x96¸'"

Это заменяет '\\\\', но, кажется, добавляет / изменяет некоторые другие символы:

>>> conv_bytes2 = my_str2.encode('utf8')
>>> len(conv_bytes2)
6
>>> repr(conv_bytes2)
"b'w\\x12\\xc2\\x96\\xc2\\xb8'"

Там должно быть разумным способом преобразования (сложного) байта в строку и обратно. Как мне этого добиться?

1 Ответ

0 голосов
/ 07 мая 2018

Примечание: некоторые коды найдены в интернете. Может быть защищено авторским правом.

Вы можете попытаться преобразовать его в шестнадцатеричный формат. Тогда его легко конвертировать обратно в байтовый формат.

Пример кода для преобразования байтов в строку:

hex_str = rnd_bytes.hex()

Вот как выглядит hex_str:

'771296b8'

И код для преобразования его обратно в байты:

new_rnd_bytes = bytes.fromhex(hex_str)

Результат:

b'w\x12\x96\xb8'

Для обработки вы можете использовать:

readable_str = ''.join(chr(int(hex_str[i:i+2], 16)) for i in range(0, len(hex_str), 2))

Но новее попробуйте кодировать читаемую строку, вот как выглядит читаемая строка:

'w\x12\x96¸'

После обработки читаемой строки преобразуйте ее обратно в шестнадцатеричный формат, прежде чем преобразовать обратно в строку байтов, например:

hex_str = ''.join([str(hex(ord(i)))[2:4] for i in readable_str])
...