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

时间:2018-05-07 10:00:30

标签: python-3.x type-conversion byte

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

假设:

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'"

必须是将(复杂)字节转换为字符串并返回的探测器方式。我怎样才能做到这一点?

1 个答案:

答案 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])