如何使用ctypes在Python中模拟动态大小的C结构

时间:2010-08-03 20:24:13

标签: python c ctypes

我正在编写一些python代码来与广泛使用结构的C DLL进行交互。

其中一个结构包含嵌套结构。我知道这对ctypes模块来说不是问题。问题是有一个经常使用的结构,在C中,是通过宏定义的,因为它包含一个可以变化的“静态”长度数组。这令人困惑,所以这里有一些代码

struct VarHdr {
    int size;
}

#define VAR(size) \
    struct Var {
        VarHdr hdr;
        unsigned char Array[(size)];
    }

然后在其他结构中使用它

struct MySruct {
    int foo;
    VAR(20) stuffArray;
}

接下来的问题是如何在Python中模拟这个结果,结果可以在我的pythong脚本和DLL之间来回传递。

顺便说一句,我知道我可以对那里的数字进行硬编码,但是这个“VAR”的几个实例都有不同的大小。

1 个答案:

答案 0 :(得分:6)

只要知道尺寸,就可以使用工厂来定义结构。

http://docs.python.org/library/ctypes.html#variable-sized-data-types

  

使用可变大小数据的另一种方法   使用ctypes的类型是使用   Python的动态特性,以及   (重新)定义之后的数据类型   所需的尺寸已经知道了   个案基础。

(未经测试)示例:

def define_var_hdr(size):
   class Var(Structure):
       fields = [("size", c_int),
                 ("Array", c_ubyte * size)]

   return Var

var_class_10 = define_var_hdr(10)
var_class_20 = define_var_hdr(20)
var_instance_10 = var_class_10()
var_instance_20 = var_class_20()