Python struct模块二进制转换详解

Mia
Mia
发布时间:2026-10-16| 4人浏览过
原创

本文详解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语言类型标准大小
bsigned charBunsigned char1
hshortHunsigned short2
iintIunsigned int4
llongLunsigned long4
qlong longQunsigned long long8
nssize_tNsize_t 

其他支持的数据类型包括:

格式C 类型Python 类型标准大小
x填充字节无 
cchar长度为1的字节串 
?_Boolbool1
e float2
ffloatfloat4
ddoublefloat8
schar[]字节串 
pchar[]字节串 
Pvoid*整数 

获取标准大小与对齐控制

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模块进行二进制转换的具体用法介绍。如需了解更多相关内容,建议查阅本站过往文章或继续浏览后续技术文档,感谢支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。