Python使用struct处理二进制(pack和unpack用法)
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重要的三个函数是pack(), unpack(), calcsize() # 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) pack(fmt, v1, v2, ...) # 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple unpack(fmt, string) # 计算给定的格式(fmt)占用多少字节的内存 calcsize(fmt 在Python编程中,有时我们需要处理二进制数据,特别是在涉及文件操作、网络通信(如socket)等场景。这时,Python的`struct`模块提供了一种有效的方法来处理这些数据,尤其是与C语言中的结构体类似的数据。`struct`模块包含了三个关键函数:`pack()`、`unpack()`和`calcsize()`。 1. `pack(fmt, v1, v2, ...)`: 这个函数用于将一系列值根据指定的格式`fmt`打包成一个字节串。`fmt`是一个包含格式代码的字符串,用于定义数据的类型和排列顺序。例如,`fmt = "!H4s2I"`,其中`!`代表网络字节序,`H`代表无符号短整型,`4s`代表长度为4的字符串,`2I`代表两个无符号整型。`v1, v2, ...`是与`fmt`中格式代码相对应的值。 2. `unpack(fmt, string)`: 这个函数接收一个字节串`string`,并根据`fmt`解包成一个元组。它将字节串解析为与`fmt`相符的数据类型。例如,`struct.unpack("!H4s2I", s)`会将字节串`s`解包为`(id, tag, version, count)`元组。 3. `calcsize(fmt)`: 此函数用于计算给定`fmt`格式字符串所占用的字节大小。这在预先知道内存分配或数据传输量时非常有用。 `fmt`字符串中的格式代码对应于不同的数据类型: - `x`: 填充字节,无实际值。 - `c`: 单个字符,对应Python的字符串(长度1)。 - `b`: 签名的字符,相当于Python的整数。 - `B`: 无签名的字符,相当于Python的整数。 - `_Bool`: 对应Python的布尔值。 - `h`: 短整型,2字节。 - `H`: 无签名的短整型,2字节。 - `i`: 整型,4字节。 - `I`: 无签名的整型,4字节。 - `l`: 长整型,4字节(Python 2);64位整型,8字节(Python 3)。 - `L`: 无签名的长整型,4字节(Python 2);64位无签名整型,8字节(Python 3)。 - `q`: 长长整型,8字节。 - `Q`: 无签名的长长整型,8字节。 - `f`: 浮点数,4字节。 - `d`: 双精度浮点数,8字节。 - `s`: 字符数组,对应Python的字符串。 - `p`: 字符数组,对应Python的字符串,带空字符结束。 - `P`: 无符号整型,用于表示指针(在Python中没有直接对应物)。 使用示例1: 假设我们有一个结构体`Header`,包含一个无符号短整型`id`、长度为4的字符串`tag`和两个无符号整型`version`和`count`。从socket接收数据后,我们可以使用`unpack`解析数据: ```python import struct id, tag, version, count = struct.unpack("!H4s2I", s) ``` 相反,要将数据打包为结构体格式,可以使用`pack`: ```python ss = struct.pack("!H4s2I", id, tag, version, count) ``` 示例2: 对于数值到字节串的转换: ```python import struct a = 12.34 bytes = struct.pack('d', a) # 'd'表示双精度浮点数 ``` 然后可以使用`unpack`将其反向转换: ```python a, = struct.unpack('d', bytes) ``` 如果需要打包多个数据,可以这样做: ```python a = 'hello' b = 'world!' c = 2 d = 45.123 bytes = struct.pack('5s6sf', a, b, c, d) ``` 处理二进制文件时,我们需要以二进制模式打开文件: ```python binfile = open(filepath, 'rb') # 读二进制文件 binfile = open(filepath, 'wb') # 写二进制文件 ``` 读取文件内容后,可以使用`struct.unpack`解码,写入文件则使用`struct.pack`编码。 Python的`struct`模块提供了强大的工具,用于在Python对象和二进制数据之间进行转换,这对于处理底层数据结构或与系统底层交互(如C库)非常有用。正确理解和使用`struct`,可以极大地提升我们在处理二进制数据时的效率和准确性。
- 粉丝: 0
- 资源: 930
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip
- (源码)基于Android的饭店点菜系统.zip
- (源码)基于Android平台的权限管理系统.zip
- (源码)基于CC++和wxWidgets框架的LEGO模型火车控制系统.zip
评论0