Учитывая случайный байт (т.е. не только цифры / символы!), Мне нужно преобразовать его в строку и затем обратно в начальный байт без потери информации. Это кажется основной задачей, но я столкнулся со следующими проблемами:
Предполагая, что:
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'"
Там должно быть разумным способом преобразования (сложного) байта в строку и обратно. Как мне этого добиться?