将bytearray插入到bytearray中 Python

9

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

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: 需要一个整数 ```
3个回答

15

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]

2
@Russell因为.insert尝试将对象,即整个字节数组作为第i个元素插入。但这不是你想要的,字节数组只能包含字节*,不能包含字节数组对象。想象一下:x = [1,2,3]; y = ['a','b']; x.insert(0,y)会得到x == [['a', 'b'], 1, 2, 3] - juanpa.arrivillaga

1
>>> 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')

1
是的...但我实际上需要在非零索引处偶尔插入,而连接可能无法起作用。 - Russell

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接