在 Python3 中将字节转换为字符串并正确返回?

bla*_*ack 2 byte type-conversion python-3.x

给定一个随机字节(即不仅是数字/字符!),我需要将其转换为字符串,然后不丢失信息的情况下返回初始字节。这似乎是一项基本任务,但我遇到了以下问题:

假设:

rnd_bytes = b'w\x12\x96\xb8'
len(rnd_bytes)
Run Code Online (Sandbox Code Playgroud)

印刷: 4

现在,将其转换为字符串。注意:我需要设置backslashreplace,否则它会返回“UnicodeDecodeError”,否则会丢失将其设置为另一个标志值的信息。

my_str = rnd_bytes.decode('utf-8' , 'backslashreplace')
Run Code Online (Sandbox Code Playgroud)

现在,我有了字符串。我想将它转换回原来的字节(大小为 4!):

根据 python 资源和这个答案,有不同的可能性:

conv_bytes = bytes(my_str, 'utf-8')
conv_bytes = my_str.encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

但是 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'"
Run Code Online (Sandbox Code Playgroud)

更换'\\\\'. my_str.replace('\\\\','\\')不会改变任何东西。可能是因为四个反斜杠只代表两个。所以,my_str.replace('\\','\')会找到'\\\\',但是会导致

语法错误:扫描字符串文字时 EOL

由于最后一个论点'\'。这已经在这里讨论,其中提出了以下建议:

>>> my_str2=my_str.encode('utf_8').decode('unicode_escape')
>>> repr(my_str2)
"'w\\x12\\x96¸'"
Run Code Online (Sandbox Code Playgroud)

这取代了'\\\\'但似乎添加/更改了一些其他字符:

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

必须是一个探针的方式(复)字节转换为字符串和背部。我怎样才能做到这一点?

Ozg*_*gci 6

注意:一些代码是在 Internet 上找到的。

您可以尝试将其转换为十六进制格式。然后很容易将其转换回字节格式。

将字节转换为字符串的示例代码:

hex_str = rnd_bytes.hex()
Run Code Online (Sandbox Code Playgroud)

以下是“hex_str”的样子:

'771296b8'
Run Code Online (Sandbox Code Playgroud)

以及将其转换回字节的代码:

new_rnd_bytes = bytes.fromhex(hex_str)
Run Code Online (Sandbox Code Playgroud)

结果是:

b'w\x12\x96\xb8'
Run Code Online (Sandbox Code Playgroud)

对于处理,您可以使用:

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

但是较新的尝试对可读字符串进行编码,这是可读字符串的样子:

'w\x12\x96¸'
Run Code Online (Sandbox Code Playgroud)

处理可读字符串后,将其转换回十六进制格式,然后再将其转换回字节字符串,例如:

hex_str = ''.join([str(hex(ord(i)))[2:4] for i in readable_str])
Run Code Online (Sandbox Code Playgroud)