如何将 B 字符串转换为字节?

Posted

技术标签:

【中文标题】如何将 B 字符串转换为字节?【英文标题】:How do I convert a B string to bytes? 【发布时间】:2022-01-08 14:39:22 【问题描述】:
bstr = "b'\\xe4\\xb8\\x96\\xe7\\x95\\x8c'"
bbytes = b'\xe4\xb8\x96\xe7\x95\x8c'

我想把bstr转换成bbytes,怎么办?

【问题讨论】:

你是怎么得到那个bstr的?从源头上解决这个问题可能更容易。 【参考方案1】:

您可以使用ast.literal_eval(文档here)函数将此字符串评估为python 文字。

import ast

bstr = "b'\\xe4\\xb8\\x96\\xe7\\x95\\x8c'"
bbytes = ast.literal_eval(bstr)
print(bbytes)  # Outputs: b'\xe4\xb8\x96\xe7\x95\x8c'

此函数应该可以安全地用于用户输入(与 eval 不同),但您可能应该强制执行长度限制以解决有关使用长/复杂输入导致解释器崩溃的警告。

请注意,这也将正确解析其他有效的 Python 文字(例如 intlist 等),因此如果您想强制您只以 bytes 结尾,您应该检查一下,例如

if not isinstance(bbytes, bytes):
  raise ValueError("Input must be a bytes string")

希望您可以稍微更改输入,我将输入更改为转义 bstr,因此不会立即评估特殊字符。

如果您将此字符串作为用户输入,例如从input 或读取文件,应该已经是这种情况了。

如果你没有正确转义的输入,你会得到一个异常:

>>> bstr = "b'\xe4\xb8\x96\xe7\x95\x8c'"
>>> ast.literal_eval(bstr)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/ast.py", line 48, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "/usr/lib/python3.6/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
SyntaxError: bytes can only contain ASCII literal characters.

【讨论】:

以上是关于如何将 B 字符串转换为字节?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字节数组转换为字符串? [复制]

将字节列表转换为字节字符串

如何在 JavaScript 中使用字节数组将字符串转换为 base64 编码?

如何将字节类型转换为字典?

将二进制字符串转换为字节数组

将字节数组转换为字符串 spark