龙空技术网

Python语言编程系列006——创建与C语言兼容的结构体的方法

编码那些事 308

前言:

现时小伙伴们对“python怎么定义结构体”可能比较关切,姐妹们都需要分析一些“python怎么定义结构体”的相关内容。那么小编也在网摘上收集了一些关于“python怎么定义结构体””的相关资讯,希望我们能喜欢,姐妹们快快来学习一下吧!

问题提出

通常情况下,由上位机软件向底层硬件发送多个命令参数对硬件进行控制时,一般是将这些命令参数封装为结构体的形式进行处理的。如对于下图所示C语言中定义的包含多个参数的结构体形式如下:

而在Python语言中并没有直接提供结构体相关定义及操作方法,当使用Python编写上位机软件与底层硬件进行通信时,在Python中定义与C语言兼容的结构体是必须考虑的一个问题。

解决方法

对于这个问题,在Python中可以使用ctypes模块实现这个功能。在ctypes模块中,与结构体操作相关的操作,提供了三个抽象类,BigEndianStructure、LittleEndianStructure和Structure,分别对应了大端序、小端序及本地字节序的结构体。

在Python中定义与C语言的兼容的结构体时,必须以这三个抽象类作为基类进行定义。在这三个基类中,有两个变量是我们需要考虑重新定义的:

“_fields_”:是一个列表,存储了结构体的所有参数。每个参数是一个2元或3元的元组形式,其中元组中第一个元素是字段的名称,第二个元素指定字段的类型,它可以是任何cType数据类型。

“_pack_”:是一个可选的参数,定义了结构字段的对齐方式。注意,该变量必须在类的一开始就要定义,否则不起作用,目的是与C语言的结构体对齐方式完全一致。

实现代码

结合上面的思路,对于开始给出C语言定义的结构体CMDPara,下面给出Python中对应的具体实现代码。

上图定义了小端序的结构体类,若定义大端序、本地字节序的结构体类,只需将基类改为BigEndianStructure和Structure即可。

结构体类定义完成后,定义一个实例给其赋值即可创建与C语言兼容的结构体类,如:

当然也可以对结构体的每个参数单独赋值,如:

通过这种方式,可以在Python中创建与C语言完全兼容的结构体。

欢迎加关注,共同交流。

标签: #python怎么定义结构体