Python 处理字节串:struct.pack和struct.unpack

1. struct

struct是用来解决bytes和其他二进制数据类型的转换的模块,它使得流的操作变得非常简单,完美解决了Python没有字节数据类型的尴尬。

主要功能:

  • Python数据类型 ——> “字节串”
  • “字节串” ——> Python数据类型

struct.pack

struct的pack函数把任意数据类型变成bytes

  • 使用格式:struct.pack(format, v1, v2, ...)
    其中,format为设置的构建格式,后面有几个输入的值,就设置几个格式字符(后文2.2,当然也可以额外增加2.1的格式)。
  • 例子:struct.pack('>I', 10240099),返回生成的字节串b'\x00\x9c@c'

struct.unpack

unpack把bytes变成相应的Python数据类型

  • 使用格式:struct.unpack(format, buffer)
    其中,format为设置的构建格式,这个部分与pack有所不同。
  • 例子:struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80'),返回一个元组(4042322160, 32896)

2. 格式

格式字符串是用来在打包和解包数据时指定

### struct.pack struct.unpack 的使用方法及区别 `struct.pack` `struct.unpack` 是 Python `struct` 模块中的两个核心函数,它们分别用于将 Python 数据类型与二进制数据之间进行转换。两者之间的功能是互逆的,适用于底层数据处理、网络通信文件格式解析等场景。 #### struct.pack 的使用方法 `struct.pack(fmt, v1, v2, ...)` 函数用于将给定的变量按照指定的格式 `fmt` 打包成二进制数据(字节串)。格式字符串 `fmt` 包含格式字符可选的字节顺序、大小对齐方式的标识符。例如,`'h'` 表示短整型(2字节),`'i'` 表示整型(4字节),`'B'` 表示无符号字节(1字节)等。格式字符串前可以包含一个字节顺序标识符,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 示例代码如下: ```python import struct # 使用大端模式打包两个整数两个字节 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' ``` #### struct.unpack 的使用方法 `struct.unpack(fmt, string)` 函数用于将二进制数据按照指定的格式 `fmt` 解包为 Python 数据类型。该函数返回一个元组,其中包含解包后的数据。格式字符串 `fmt` 必须与打包时使用的格式一致,否则可能导致解包错误或数据不一致。 示例代码如下: ```python import struct # 解包之前打包的数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` #### struct.pack struct.unpack 的区别 `struct.pack` `struct.unpack` 的主要区别在于它们的功能方向不同。`struct.pack` 将 Python 数据转换为二进制数据,而 `struct.unpack` 则将二进制数据还原为 Python 数据。它们通常用于处理需要精确控制字节顺序大小的场景,例如网络协议数据的编码解码。 此外,`struct.pack` `struct.unpack` 与字符串的 `encode` `decode` 方法不同。后者用于在文本数据字节流之间进行转换,而前者用于在二进制数据 Python 数据类型之间进行转换。这种区别使得 `struct` 模块更适合处理结构化的二进制数据,如 C 语言中的结构体。 #### 格式字符串的规则 格式字符串由格式字符、数量前缀字节顺序标识符组成。格式字符定义了数据类型,如 `'i'` 表示整型,`'s'` 表示字符串,`'B'` 表示无符号字节等。数量前缀表示重复的次数,例如 `'4s'` 表示长度为 4 的字符串。字节顺序标识符定义了数据的存储方式,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 #### 注意事项 - 格式字符串中的每个格式字符对应一个数据项,数据项的数量必须与格式字符串中定义的数量一致。 - 如果格式字符串中包含字符串类型(如 `'s'`),则需要确保字符串的长度与格式字符串中指定的长度一致。 - `struct.pack` `struct.unpack` 支持的数据类型有限,主要适用于数值类型固定长度的字符串。 - 字节顺序标识符可以改变数据的存储方式,但默认情况下,`struct` 模块根据本地机器的字节顺序进行转换。 --- ### 示例代码 ```python import struct # 打包数据 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' # 解包数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` --- ### 相关问题 1. 如何使用 struct 模块处理 C 语言结构体? 2. 如何在 Python 中使用 struct 模块解析网络协议数据? 3. struct.pack struct.unpack 如何处理浮点数? 4. 如何使用 struct 模块处理变长字符串?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值