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

问题提出

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

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

解决方法

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

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

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

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

实现代码

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

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

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

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

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

欢迎加关注,共同交流。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180905A21BPL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券