Python struct模块二进制转换详解
本文详解Python中struct模块的二进制转换功能。通过pack和unpack函数实现数据打包与解包,解析格式字符串对应的数据类型与大小,并介绍calcsize、对齐方式及字节序控制。同时涵盖pack_into、unpack_from及Struct类的进阶用法,帮助开发者高效处理C语言风格的数据交互。
struct模块基础:pack与unpack
在Python中,可以使用struct模块进行二进制数据的转换操作。该模块主要包含两类核心函数:用于将Python对象转换为字节流的pack函数,以及用于将字节流还原为Python对象的unpack函数。
struct.pack函数的调用格式为struct.pack(format, v1, v2, ...)。其中,format参数指定格式字符串,v1、v2等参数表示需要转换为bytes类型的数据值。
例如,
>>> import struct
>>> struct.pack('i', 15)
b'\x0f\x00\x00\x00'
>>> struct.pack('iii', 15, 16, 17)
b'\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00'
>>> struct.pack('b', 255) #b格式的取值范围是-128到127
struct.error: byte format requires -128 <= number <= 127
>>> struct.pack('B', 200)
b'\xc8'
>>> struct.pack('B', 71) #128以内可用ASCII表示
b'G'格式字符i代表整型(int)。以数值15为例,其对应的二进制表示为F000(小端序存储),因此输出结果为b'\x0f\x00\x00\x00'。若格式字符串设为iii,则表示将三个整数依次转换为二进制数据。
格式字符串与数据类型映射
格式字符串中的每个字符对应一种特定的数据类型。以下是整型相关的格式字符对照:左侧为带符号整型,右侧为无符号整型。
| C语言类型 | C语言类型 | 标准大小 | ||
|---|---|---|---|---|
| b | signed char | B | unsigned char | 1 |
| h | short | H | unsigned short | 2 |
| i | int | I | unsigned int | 4 |
| l | long | L | unsigned long | 4 |
| q | long long | Q | unsigned long long | 8 |
| n | ssize_t | N | size_t |
其他支持的数据类型包括:
| 格式 | C 类型 | Python 类型 | 标准大小 |
|---|---|---|---|
| x | 填充字节 | 无 | |
| c | char | 长度为1的字节串 | |
| ? | _Bool | bool | 1 |
| e | float | 2 | |
| f | float | float | 4 |
| d | double | float | 8 |
| s | char[] | 字节串 | |
| p | char[] | 字节串 | |
| P | void* | 整数 |
获取标准大小与对齐控制
struct模块提供了calcsize函数,用于获取指定格式的标准大小。
>>> struct.calcsize('B')
1
>>> struct.calcsize('i')
4除了定义数据类型外,struct模块还支持指定数据的对齐方式。例如,
>>> struct.pack("i",15)
b'\x0f\x00\x00\x00'
>>> struct.pack(">i",15) #小端序
b'\x00\x00\x00\x0f'
>>> struct.pack("<i",15) #大端序
b'\x0f\x00\x00\x00'相关对齐字符的含义如下:
| @ | = | < | > | ! |
|---|---|---|---|---|
| 本机 | 本机 | 小端 | 大端 | 网络(大端) |
默认情况下,对齐字符为@,表示使用本机字节顺序和对齐规则。
进阶用法:pack_into与unpack_from
在掌握pack用法后,理解其逆操作unpack便不再困难。
>>> test = struct.pack("III",125,1255,12555)
>>> struct.unpack("III",test)
(125, 1255, 12555)除了基础的pack和unpack,struct模块还提供了类似C语言风格的pack_into和unpack_from函数,其声明格式分别为:
struct.pack_into(format, buffer, offset, v1, v2, ...)
struct.unpack_from(format, /, buffer, offset=0)其中,buffer参数表示目标缓冲流。在pack_into中,数据v1、v2等将从offset偏移量开始打包写入buffer;在unpack_from中,则从buffer的offset位置依次读取数据。
Struct类的封装与使用
struct模块还封装了一个用于二进制处理的类Struct。基于以往经验,其pack方法的实现逻辑可能类似于以下代码:
def pack(format,*args):
return Struct(format).pack(args)
Struct类的初始化方法接收一个格式字符串作为参数。例如,
>>> s = struct.Struct("III")
>>> s.pack(1,2,3)
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
以上就是关于Python中struct模块进行二进制转换的具体用法介绍。如需了解更多相关内容,建议查阅本站过往文章或继续浏览后续技术文档,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













