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

Kar*_*rim 3 c python ctypes

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

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

struct VarHdr {
    int size;
}

#define VAR(size) \
    struct Var {
        VarHdr hdr;
        unsigned char Array[(size)];
    }
Run Code Online (Sandbox Code Playgroud)

然后它用在像这样的其他结构中

struct MySruct {
    int foo;
    VAR(20) stuffArray;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jer*_*own 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()
Run Code Online (Sandbox Code Playgroud)