Python内置函数---bytearray()
用于创建可变的字节数组对象,支持动态修改其内容。
1. 基本语法与参数
bytearray(source=b'', encoding=None, errors=None)
- 参数:
- `source`:可选参数,指定初始化数据来源,可以是以下类型:
- 字符串:需配合`encoding`参数(如`utf-8`)转换为字节序列。
- 整数:创建指定长度的字节数组,所有字节初始化为`0`。
- 可迭代对象:包含0-255范围内整数的列表、元组等。
- 缓冲区对象(如`bytes`):复制其内容。
- `encoding`:字符串编码方式(仅当`source`为字符串时有效)。
- `errors`:编码错误处理策略(如`strict`、`ignore`)。
- 返回值:可变的字节数组对象。
示例:
#创建空字节数组ba1 = bytearray() bytearray(b'')#从整数创建(长度为5,初始化为0)ba2 = bytearray(5) bytearray(b'\x00\x00\x00\x00\x00')#从可迭代对象创建ba3 = bytearray(72, 101, 108, 108, 111) bytearray(b'Hello')#从字符串创建(需编码)ba4 = bytearray("你好", "utf-8") bytearray(b'\xe4\xbd\xa0\xe5\xa5\xbd')
2. 核心特性
(1) 可变性
与`bytes`不同,`bytearray`支持动态修改元素:
ba = bytearray(b'hello')ba0 = ord('H') 修改首字节为'H'的ASCII码print(ba) bytearray(b'Hello')
(2) 序列操作
支持切片、拼接、重复等操作:
ba = bytearray(b'abc')ba1:3 = b'xyz' 替换切片print(ba) bytearray(b'axyz')
3. 常用方法
(1) 修改类方法
方法 | 功能描述 | 示例 |
append(int) | 在末尾追加一个字节 | ba.append(97) → `b'ab |
extend(iterable) | 追加多个字节 | ba.extend(98, 99) → `b'abc'` |
insert(index, int) | 在指定位置插入字节 ` | ba.insert(1, 98)→ `b'abb'` |
remove(int) | 移除第一个匹配的字节 ` | ba.remove(98) → `b'ac'` |
pop(index) | 移除并返回指定索引的字节(默认末尾) | ba.pop()` → `99` |
reverse() | 反转字节数组 | ba=b'abc' → b`cba` |
(2) 搜索与统计
方法 | 功能描述 | 示例 |
count(x) | 统计字节`x`出现的次数 | ba.count(97)` → `1` |
index(x) | 返回第一个匹配字节的索引 | `ba.index(98)` → `1` |
find(x) | 类似`index()`,未找到返回 | ba.find(99)` → `2` |
(3) 其他方法
方法 | 功能描述 | 示例 |
decode() | 将字节数组解码为字符串 | ba = b'abc' → 'abc'` |
hex() | 返回十六进制字符串表示 | ba = b'\x01\x02' → '0102'` |
fromhex(string) | 类方法,从十六进制字符串创建数组 | `bytearray.fromhex('0102')` |
4. 典型应用场景
(1) 二进制数据处理
直接操作二进制数据(如文件读写、网络协议解析):
# 读取文件二进制内容并修改with open("data.bin", "rb") as f:data = bytearray(f.read())data0 = 0x01 #修改首字节
(2) 动态编码转换
处理需要动态修改的编码数据:
text = "Hello, 世界"ba = bytearray(text, "utf-8")ba7:9 = bytearray("Python", "utf-8") 替换部分内容print(ba) bytearray(b'HelloPython')
(3) 性能优化
相比`bytes`,`bytearray`的修改操作更高效:
#高频修改场景(如图像处理)pixels = bytearray(1000000)# 初始化百万字节for i in range(len(pixels)):pixelsi = 255 - pixelsi #反色处理
5. 注意事项
1. 类型限制
`bytearray`仅支持0-255的整数,非整数类型会触发`TypeError`:
bytearray(256) #ValueError: bytes must be in range(0, 256)
2. 编码错误处理
字符串转`bytearray`时需处理编码错误:
bytearray("你好", "ascii", errors="ignore") #忽略无法编码的字符
3. 与`bytes`的区别
- `bytes`不可变,`bytearray`可变。
- `bytearray`支持更多修改方法(如`append`、`remove`)。
- `bytearray`初始化时默认填充`0`,而`bytes()`生成空对象。
6. 实际代码示例
(1) 动态修改字节
ba = bytearray(b'abcd')ba1:3 = b'XY' #替换索引1-2的字节print(ba) bytearray(b'aXcd')
(2) 文件内容加密
#简单异或加密
with open("secret.txt", "rb") as f:data = bytearray(f.read())for i in range(len(data)):datai ^= 0xFF 按位取反with open("encrypted.bin", "wb") as f:f.write(data)
(3) 自定义协议解析
#解析自定义二进制协议(头部4字节长度 + 数据)data = bytearray(b'\x00\x00\x00\x05hello')length = int.from_bytes(data0:4, "big")payload = data4:4+lengthprint(payload) bytearray(b'hello')
总结
`bytearray()`是处理动态二进制数据的核心工具,其可变性和高效性使其在网络编程、文件处理及加密算法中广泛应用。通过灵活运用构造方法、修改方法和编码转换功能,开发者能高效实现复杂的数据操作逻辑。