【问题标题】:Insert bytearray into bytearray Python将字节数组插入字节数组 Python
【发布时间】:2018-03-02 01:20:30
【问题描述】:

我试图在开始时将一个字节数组插入另一个字节数组。这是我想要完成的一个简单示例。

import struct
a = bytearray(struct.pack(">i", 1))
b = bytearray(struct.pack(">i", 2))
a = a.insert(0, b)
print(a)

但是这会失败并出现以下错误:

a = a.insert(0, b) TypeError: an integer is required

【问题讨论】:

    标签: python insert


    【解决方案1】:

    bytearray 是一个序列类型,它支持基于切片的操作。带有切片的“插入位置i”成语如下x[i:i] = <a compatible sequence>。所以,对于拳头位置:

    >>> a
    bytearray(b'\x00\x00\x00\x01')
    >>> b
    bytearray(b'\x00\x00\x00\x02')
    >>> a[0:0] = b
    >>> a
    bytearray(b'\x00\x00\x00\x02\x00\x00\x00\x01')
    

    对于第三位:

    >>> a
    bytearray(b'\x00\x00\x00\x01')
    >>> b
    bytearray(b'\x00\x00\x00\x02')
    >>> a[2:2] = b
    >>> a
    bytearray(b'\x00\x00\x00\x00\x00\x02\x00\x01')
    

    注意,这不等同于.insert,因为对于序列,.insert将整个对象作为第 i 个元素插入。因此,请考虑以下带有列表的简单示例:

    >>> y = ['a','b']
    >>> x.insert(0, y)
    >>>
    >>> x
    [['a', 'b'], 1, 2, 3]
    

    真正想要的是:

    >>> x
    [1, 2, 3]
    >>> y
    ['a', 'b']
    >>> x[0:0] = y
    >>> x
    ['a', 'b', 1, 2, 3]
    

    【讨论】:

    • @Russell 因为.insert 试图插入对象,即整个字节数组作为第 i 个元素。但这不是你想要的,bytearrays 只能包含 bytes,而不是 bytearray-objects。想一想:x = [1,2,3]; y = ['a','b']; x.insert(0,y) 会给你x == [['a', 'b'], 1, 2, 3]
    【解决方案2】:
    >>> a = bytearray(struct.pack(">i", 1))
    >>> b = bytearray(struct.pack(">i", 2))
    >>> a = b + a
    >>> a
    bytearray(b'\x00\x00\x00\x02\x00\x00\x00\x01')
    

    【讨论】:

    • 是的......但我实际上需要偶尔在连接可能不起作用的非零索引处插入。
    【解决方案3】:

    Bytearray 是可变的单字节序列(整数),所以 bytearray 只接受满足值限制 0

    >>> a = bytearray(struct.pack(">i", 1))
    >>> b = bytearray(struct.pack(">i", 2))
    >>> a.insert(0,b)
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: an integer is required
    
    >>> a=b+a
    >>> a
    bytearray(b'\x00\x00\x00\x02\x00\x00\x00\x01')
    
    >>>a[:2]=b
    >>> a
    bytearray(b'\x00\x00\x00\x02\x00\x01')
    

    【讨论】:

    • 我不明白为什么a[:2]=b 会为a 给出结果bytearray(b'\x00\x00\x00\x02\x00\x01')。事实上,如果在a=b+a 之后执行,结果将是bytearray(b'\x00\x00\x00\x02\x00\x02\x00\x00\x00\x01')。这个例子不是序列!
    猜你喜欢
    • 2012-10-18
    • 2015-05-24
    • 2010-10-29
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多