当前位置: 首页 > news >正文

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()`是处理动态二进制数据的核心工具,其可变性和高效性使其在网络编程、文件处理及加密算法中广泛应用。通过灵活运用构造方法、修改方法和编码转换功能,开发者能高效实现复杂的数据操作逻辑。

相关文章:

  • 【Java设计模式及实践学习-第4章节-结构型模式】
  • 一对多的数据结构(树)的基本概念
  • spring-session-data-redis使用
  • 困局与破局:当传统校园能源管理遭遇“散沙式“能耗困局
  • opencv--图像滤波
  • 【ASR学习笔记】常见VAD模型识别语音活动的方式对比
  • Spring Boot 中处理 JSON 数值溢出问题:从报错到优雅解决
  • rk3588 驱动开发(二)第四章嵌入式 Linux LED 驱动开发实验
  • 图像预处理-模板匹配
  • Linux:42线程控制lesson30
  • org.springframework.core.env.PropertiesPropertySource 类详解
  • LISN的使用
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(9): 意向形
  • 强化学习算法笔记【AMP】
  • 进程(Process)详解
  • c++ 互斥锁
  • c++学习流程
  • Python高级爬虫之JS逆向+安卓逆向1.6节: 函数基础
  • 动态规划(一)【背包】
  • 达梦统计信息收集情况检查
  • 我国翻译从业人员达680.8万人,行业总需求仍在上升
  • 海关总署:明确部分货物、物品不再按进出境特殊物品监管
  • 商务部:一季度社零总额12.47万亿元,同比增长4.6%
  • 华天酒店:2024年归母净亏损约1.81亿元,已连续亏损3年
  • 中办、国办印发《农村基层干部廉洁履行职责规定》
  • 美国税局代理局长卷入马斯克与美财长之争,还未工作就被迫离职