Python使用struct模块处理C语言结构体

顾星河
顾星河
发布时间:2026-10-16 | 5人浏览过
原创

本文介绍Python中struct模块如何模拟C语言结构体。通过pack()将数据打包为字节字符串,利用unpack()还原为元组。重点解析fmt格式字符串,包括字节序、对齐方式及类型字符,并结合hhl格式示例演示具体转换过程与结果。

struct介绍

Python内置了struct模块,用于处理类似C语言中的结构体数据。

其核心机制是将结构体序列化为字符串,该字符串实际由结构体的各个字节组成。

struct中的常用接口

该模块主要提供两个核心函数:pack()和unpack()。

pack()负责将结构体数据转换为字符串(即字节序列),而unpack()执行相反操作,将字符串还原为原始数据。

pack()

pack()函数的具体说明如下(参考Python 2.7.15文档):

struct.pack(fmt, v1, v2, ...) 
Return a string containing the values v1, v2, ... packed according to the given format. 
The arguments must match the values required by the format exactly.

fmt参数是一个特殊字符串,用于定义结构体的格式规范。

v1、v2等参数对应结构体中的各个成员变量。

该函数返回一个字符串对象。

unpack()

unpack()函数的具体说明如下(参考Python 2.7.15文档):

struct.unpack(fmt, string) 
Unpack the string (presumably packed by pack(fmt, ...)) according to the given format. 
The result is a tuple even if it contains exactly one item. 
The string must contain exactly the amount of data required by the format (len(string) must equal calcsize(fmt)).

fmt参数与pack()中的定义相同。

string参数是由pack()转换生成的字符串(即字节序列)。

该函数返回一个元组,其中包含解包后的各个结构体成员变量。

fmt

fmt是struct模块中最关键的部分。

它可以拆分为两个主要部分。

第一部分指定字节序和对齐信息,由以下字符表示:

此部分为可选,若未指定任何字符,则默认行为等同于使用'@'。

第二部分字符表示成员的数据类型,这决定了每个成员在字符串中占用的字节数,具体对应关系如下:

示例

以下是一个测试通过的示例(基于Python 2.7):

import struct
if __name__ == "__main__":
    result = struct.pack('hhl', 1, 2, 3)            # result is byte string.
    for i in result:
        print '0x%02x' % ord(i)                     # 01 00 02 00 03 00 00 00
    result1 = struct.unpack ('hhl', result)         # byte string is transfered to tuple.
    print type (result1)                            # the type is tuple.
    print result1                                   # (1, 2, 3)

首先调用pack(),参数'hhl'表示包含三个成员,类型分别为short、short和long,对应的值分别为1、2、3。

执行pack()后返回的字节序列如代码右侧注释所示。

由于此处使用默认的大小端和对齐方式(本机为小端模式),因此值1对应short的字节为0x01、0x00,值2对应short的字节为0x02、0x00,值3对应long的字节为0x03、0x00、0x00、0x00。

随后执行unpack()函数,返回一个元组,其成员分别为1、2、3。

以上即为Python中使用struct模块转换C语言结构体的完整流程,更多相关技术资料请参阅本站其他文章。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表