【问题标题】:Escaped string of bytes to bytestring将字节串转义为字节串
【发布时间】:2015-05-03 08:36:11
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python string byte


    【解决方案1】:

    您通常会让 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 文字,因此您最终可以使用任何其他对象类型,包括数字、字符串和容器。

    【讨论】:

    • @thefourtheye:这在这里没有任何帮助,因为它不能处理转义序列的解释。您仍然不能将 NUL 字节作为 sys.argv 值传递。
    • 是的,我正要补充这个错误没有帮助,但我的浏览器由于某种原因不允许我。我会删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多