【问题标题】:Python3 How to make a bytes object from a list of integersPython3如何从整数列表中创建一个字节对象
【发布时间】:2015-08-19 21:53:12
【问题描述】:

我有一个整数数组(都小于 255),对应于字节值(即[55, 33, 22]),我怎样才能把它变成一个看起来像的字节对象

b'\x55\x33\x22

谢谢

【问题讨论】:

    标签: python python-3.x byte bytearray


    【解决方案1】:

    只需调用bytes 构造函数即可。

    正如文档所说:

    …构造函数参数被解释为bytearray()

    如果您点击该链接:

    如果是iterable,则必须是0 <= x < 256范围内的整数的iterable,作为数组的初始内容。

    所以:

    >>> list_of_values = [55, 33, 22]
    >>> bytes_of_values = bytes(list_of_values)
    >>> bytes_of_values
    b'7!\x16'
    >>> bytes_of_values == '\x37\x21\x16'
    True
    

    当然这些值不会是\x55\x33\x22,因为\x 表示十六进制,而十进制值55, 33, 22 是十六进制值37, 21, 16。但是如果你有十六进制值55, 33, 22,你会得到你想要的输出:

    >>> list_of_values = [0x55, 0x33, 0x22]
    >>> bytes_of_values = bytes(list_of_values)
    >>> bytes_of_values == b'\x55\x33\x22'
    True
    

    【讨论】:

    • 很好地捕捉到不匹配的十进制/十六进制输入和输出。
    【解决方案2】:

    bytes 构造函数接受一个可迭代的整数,因此只需将您的列表提供给它:

    l = list(range(0, 256, 23))
    print(l)
    b = bytes(l)
    print(b)
    

    输出:

    [0, 23, 46, 69, 92, 115, 138, 161, 184, 207, 230, 253]
    b'\x00\x17.E\\s\x8a\xa1\xb8\xcf\xe6\xfd'
    

    另请参阅:Python 3 - on converting from ints to 'bytes' and then concatenating them (for serial transmission)

    【讨论】:

    • 在 Python 2 中,bytes(bytearray(l)),因为在 Python 2 中为 bytes is str
    【解决方案3】:
    struct.pack("b"*len(my_list),*my_list)
    

    我认为会起作用

    >>> my_list = [55, 33, 22]
    >>> struct.pack("b"*len(my_list),*my_list)
    b'7!\x16'
    

    如果你想要十六进制,你需要在列表中设置为十六进制

    >>> my_list = [0x55, 0x33, 0x22]
    >>> struct.pack("b"*len(my_list),*my_list)
    b'U3"'
    

    在所有情况下,如果该值具有 ascii 表示形式,它将在您尝试打印或查看时显示它...

    【讨论】:

    • 我想这很接近了,我确实收到了这个错误struct.error: byte format requires -128 <= number <= 127你能帮忙吗?
    • @Startec 'b' 格式表示有符号字节 [-128, 127]。您想为 _un_signed 字节 [0,255] 使用大写 'B'
    • 您不需要为此使用struct
    • 嘿,是的,但你可以:P ...(我不在 py3 中,但我现在看到有更好的解决方案:P,我认为这也适用于 py2)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 2011-10-29
    • 2020-06-17
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多