将字节串转义为 bytestring

Escaped string of bytes to bytestring

我是 Python 的新手,我需要从命令行参数中读取字节串。我正在使用 Python 3.4.

目前,我正在使用 argparse 解析参数,数据配置如下:parser.add_argument("-d", "--data", default=b'[=10=]')

当我用 -d 参数调用我的程序时(例如 python myprogram.py -d b'd\x00!\x00W\x00'),它将 -d 的值解释为一个字符串,转义斜杠并将 'b' 视为字符串的一部分,像这样:'b\'d\x00!\x00W\x00\''

有没有办法将 argparse 的输出转义并转换为字节?

您通常会让 shell 制定确切的字节,但由于您 cannot pass in NUL bytes as arguments 要求用户输入转义序列是一个合理的解决方法。

但是,shell 不会解释 Python 字节字符串文字表示法。

在这种情况下,我会要求用户输入 十六进制 值:

python myprogram.py -d "64 00 21 00 57 00"

并使用 binascii.unhexlify() function 从中生成你的 bytes 值(首先删除所有空格):

whitespace = dict.fromkeys((9, 10, 13, 32))  # tab, space, newline and carriage return
data = binascii.unhexlify(args.data.translate(whitespace))

这确实需要您将默认参数值设置为兼容值:

parser.add_argument("-d", "--data", default='00')

另一种方法是使用 ast.literal_eval() function 来解释 Python 字节字符串文字语法:

data = ast.literal_eval(args.data)

你的默认值是:

parser.add_argument("-d", "--data", default=repr(b'[=14=]'))

但考虑到此函数接受任何 Python 文字,因此您最终可能会得到任何其他对象类型,包括数字、字符串和容器。