转义为字节串的字节串

时间:2015-05-03 08:36:12

标签: python string byte

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

目前,我正在使用argparse来解析参数,使用这种数据配置:python myprogram.py -d b'd\x00!\x00W\x00'

当我用-d参数调用我的程序时(例如'b\\'d\\x00!\\x00W\\x00\\''),它将-d的值解释为字符串,转义斜杠并将'b'视为字符串的一部分,如下所示:{ {1}}

有没有办法从argparse中取消输出并将其转换为字节?

1 个答案:

答案 0 :(得分:2)

你通常会让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'\0'))

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