给定一个随机字节(即不仅仅是数字/字符!),我需要将其转换为字符串,然后返回初始字节而不会丢失信息。这似乎是一项基本任务,但我遇到了以下问题:
假设:
rnd_bytes = b'w\x12\x96\xb8'
len(rnd_bytes)
打印:4
现在,将其转换为字符串。注意:我需要设置backslashreplace
,否则会返回'UnicodeDecodeError',或者将信息设置为另一个标志值。
my_str = rnd_bytes.decode('utf-8' , 'backslashreplace')
现在,我有了字符串。 我想将其转换回原始字节(大小为4!):
根据python ressources和answer,有不同的可能性:
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
由于最后一个参数'\'
。这已经讨论here,其中提出了以下建议:
>>> 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'"
必须是将(复杂)字节转换为字符串并返回的探测器方式。我怎样才能做到这一点?
答案 0 :(得分:1)
注意:某些代码在Internet上找到。可能受版权保护。
您可以尝试将其转换为十六进制格式。然后很容易将其转换回字节格式。
将字节转换为字符串的示例代码:
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])