我想在另一个字节数组的开头插入一个字节数组。这是我想要完成的简单示例。
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: 需要一个整数 ```
bytearray
是一个序列类型,并支持基于切片的操作。使用切片的“在位置i插入”习惯用法如下:x[i:i] = <兼容序列>
。因此,对于第一个位置:
>>> 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]
>>> 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')
Bytearray 是可变的单字节(整数)序列,因此 bytearray 只接受符合值限制 0 <= x <= 255 的整数:
>>> 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')
。这个例子不是一个序列! - Toady
.insert
尝试将对象,即整个字节数组作为第i个元素插入。但这不是你想要的,字节数组只能包含字节*,不能包含字节数组对象。想象一下:x = [1,2,3]; y = ['a','b']; x.insert(0,y)
会得到x == [['a', 'b'], 1, 2, 3]
- juanpa.arrivillaga