bytearray
是 Python 中的一个内置类型,用于表示可变长度的字节序列。它是 bytes
类型的可变版本,即 bytearray
实例的内容可以修改,而 bytes
实例是不可变的。
创建 bytearray
的方式:
-
通过构造函数创建:可以通过传递一个整数(表示字节数组的长度)来创建一个新的空字节数组,或者传递一个字节字符串或字节数组来创建一个新的字节数组。
ba1 = bytearray(10) # 创建一个长度为10的空字节数组 ba2 = bytearray(b'hello') # 创建一个包含'hello'的字节数组
-
通过字节串转换:可以使用
bytes
类型的tobytes
方法将bytearray
转换为字节串,或者使用bytearray
构造函数将字节串转换为bytearray
。ba = bytearray(b'hello') bs = ba.tobytes() # bs 是一个 bytes 实例
-
通过列表转换:还可以使用整数列表来创建
bytearray
,列表中的每个元素都必须在 0 到 255 之间。ba = bytearray([72, 101, 108, 108, 111]) # 创建一个包含'hello'的字节数组(ASCII 码)
bytearray
的主要优点是可变性,可以使用索引、切片或 append
、extend
、insert
、remove
、pop
等方法来修改它。这在处理二进制数据时非常有用,特别是需要修改或构建二进制数据时。
此外,bytearray
还支持一些其他方法,如 fromhex
(从十六进制字符串创建字节数组)和 tohex
(将字节数组转换为十六进制字符串)。
# 创建一个bytearray对象
ba = bytearray(b'Hello, World!') # 打印原始bytearray
print('Original bytearray:', ba) # 输出:bytearray(b'Hello,World!')# 修改bytearray中的某个字节
# 将 'H' (ASCII 72) 修改为 'h' (ASCII 104)
ba[0] = 104
print('Modified bytearray:', ba) # 输出:bytearray(b'hello,World!')# 也可以在bytearray末尾添加新的字节
ba.extend(b' again!')
print('Extended bytearray:', ba) # 输出:bytearray(b'hello,World! again!')# 使用append方法添加一个字节
ba.append(ord('!'))
print('Appended bytearray:', ba) # bytearray(b'hello,World! again!!')# 删除bytearray中的倒数2个字节
del ba[-2:]
print('Truncated bytearray:', ba) # bytearray(b'hello, World! again')# 使用insert方法插入一个字节
ba.insert(0, ord('M'))
print('Inserted bytearray:', ba) # bytearray(b'Mhello, World! again')# 使用remove方法删除一个字节(注意:只会删除第一个匹配的字节)
ba.remove(ord('l'))
print('Removed bytearray:', ba) # bytearray(b'Mhelo, World! again')# 使用pop方法弹出并返回指定索引处的字节
popped = ba.pop(5)
print('Popped byte:', popped) # 44
print('After pop bytearray:', ba) # bytearray(b'Mhelo World! again') 【删除chr(44):','# 反转bytearray
ba.reverse() # 打印反转后的bytearray
print('Reversed bytearray:', ba) # bytearray(b'niaga !dlroW olehM')
ps:
*将bytearray转换为字符串,可以使用decode()方法
*当只涉及英文字符时,ASCII编码和UTF-8编码相同,因为UTF-8编码对ASCII字符集是兼容的。对于ASCII字符集中的字符,它们在UTF-8编码中仍然使用一个字节表示,且字节的二进制表示与ASCII编码相同。因此,当只处理英文字符时,使用ASCII编码或使用UTF-8编码没有区别。