在Python中,bytearray
是一个可变序列,用于表示一个字节数组。与不可变的 bytes
类型相比,bytearray
允许你修改其内容。你可以通过索引来访问和修改 bytearray
中的元素,也可以添加或删除元素。
使用 bytearray
的一些示例:
python
# 创建一个空的 bytearray
ba = bytearray()
print(ba) # 输出: bytearray(b'')
# 创建一个包含初始值的 bytearray
ba = bytearray([0x11, 0x22, 0x33])
print(ba) # 输出: bytearray(b'\x11\x22\x33')
# 访问 bytearray 中的元素
print(ba[0]) # 输出: 17(0x11 的十进制表示)
# 修改 bytearray 中的元素
ba[1] = 0x44
print(ba) # 输出: bytearray(b'\x11D\x33'),其中 'D' 是 0x44 的 ASCII 字符
# 添加元素到 bytearray 的末尾
ba.append(0x55)
print(ba) # 输出: bytearray(b'\x11D\x33U'),其中 'U' 是 0x55 的 ASCII 字符
# 从 bytearray 中删除元素
del ba[2]
print(ba) # 输出: bytearray(b'\x11D\x55')
# 将 bytes 转换为 bytearray
b = b'\x01\x02\x03'
ba = bytearray(b)
print(ba) # 输出: bytearray(b'\x01\x02\x03')
# 将 bytearray 转换为 bytes
b = bytes(ba)
print(b) # 输出: b'\x01\x02\x03'
在上面的示例中,你可以看到如何使用 bytearray
来存储和操作字节序列。这对于需要频繁修改字节数据的场景特别有用,因为 bytes
类型是不可变的,每次修改都需要创建一个新的 bytes
对象。而 bytearray
允许你原地修改数据,从而提高性能。
数组的长度:
python
# 创建一个bytearray
app_buf = bytearray([0x11, 0x22, 0x33])
# 输出bytearray的长度
print(len(app_buf)) # 输出: 3
数组打印
注意:如果数组里的内容为 字符直接用print 打印就会直接打印成字符!例如
ba[1] = 0x44 print(ba) # 输出: bytearray(b'\x11D\x33'),其中 'D' 是 0x44 的 ASCII 字符
十六进制方式打印数组
要以十六进制的方式打印bytearray
中的每个字节,你可以使用列表推导式(list comprehension)结合format
函数或f-string(格式化字符串字面量)来格式化每个字节。以下是一些示例:
使用循环和直接打印:
python
app1_buf = bytearray([0x11,0x23,0x63])
for byte in app1_buf:
print(f"{byte:02X}", end=' ')
使用列表推导式和format
函数:
python
app_buf = bytearray([0x11, 0x22, 0x33])
hex_values = ['{:02X}'.format(byte) for byte in app_buf]
print(' '.join(hex_values)) # 输出: 11 22 33
使用列表推导式和f-string(Python 3.6+):
python
app_buf = bytearray([0x11, 0x22, 0x33])
hex_values = [f'{byte:02X}' for byte in app_buf]
print(' '.join(hex_values)) # 输出: 11 22 33
在这两个示例中,我们都创建了一个列表推导式来遍历bytearray
中的每个字节,并使用format
函数或f-string将其格式化为两位的十六进制字符串。然后,我们使用join
方法将这些字符串连接成一个用空格分隔的字符串,并打印出来。
十进制打印数组
如果你想要以十进制的方式打印bytearray
中的每个字节,你可以直接遍历bytearray
并打印每个字节的值,因为Python在默认情况下会以十进制打印小的整数。但是,如果你想要确保它们是作为十进制数明确显示的(特别是当与其他数据混合时),你可以使用format
函数或f-string来指定格式。
以下是一些示例:
使用循环和直接打印:
python
app_buf = bytearray([0x11, 0x22, 0x33])
for byte in app_buf:
print(byte) # 直接打印,默认为十进制
# 输出:
# 17
# 34
# 51
使用列表推导式和format
函数(虽然在这种情况下可能不是必需的,但为了一致性):
python
app_buf = bytearray([0x11, 0x22, 0x33])
decimal_values = ['{}'.format(byte) for byte in app_buf]
print(' '.join(decimal_values)) # 使用' '连接成字符串
# 输出: 17 34 51
使用列表推导式和f-string:
python
app_buf = bytearray([0x11, 0x22, 0x33])
decimal_values = [f'{byte}' for byte in app_buf]
print(' '.join(decimal_values)) # 使用' '连接成字符串
# 输出: 17 34 51
在这些示例中,你可以看到如何遍历bytearray
中的每个字节,并直接打印它们(默认为十进制),或者使用列表推导式和字符串格式化来创建一个包含十进制值的字符串列表,然后将其连接成一个用空格分隔的字符串。