【python学习】bytearray 数组

在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中的每个字节,并直接打印它们(默认为十进制),或者使用列表推导式和字符串格式化来创建一个包含十进制值的字符串列表,然后将其连接成一个用空格分隔的字符串。

相关推荐
LeoLei80603 分钟前
新特性之C++17
开发语言·c++
码农超哥同学12 分钟前
Python面试题:如何在 Python 中反转一个字符串?
开发语言·windows·python·面试·编程
Wen.py.java28 分钟前
Python商务数据分析知识专栏(六)——Python数据分析的应用④Python数据分析实训
人工智能·python·数据分析
不死鸟.亚历山大.狼崽子30 分钟前
python库(2):Passlib库
开发语言·python
jllws133 分钟前
C++基础:STL概述
开发语言·c++
FightingLod36 分钟前
C++中list容器使用详解
开发语言·c++·list
Zucker n1 小时前
学会python——用python制作一个登录和注册窗口(python实例十八)
开发语言·python
mana飞侠1 小时前
代码随想录算法训练营第59天:动态[1]
开发语言·数据结构·算法·动态规划
艾恩小灰灰1 小时前
为何Web前端开发仍坚守 HTML 和 CSS,而不全然拥抱纯 JavaScript?
开发语言·前端·javascript·css·html·纯js
瑶风1 小时前
go语言并发编程2-runtime
开发语言·golang·xcode