代码之家  ›  专栏  ›  技术社区  ›  Karim

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

  •  3
  • Karim  · 技术社区  · 14 年前

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

    其中一个结构包含嵌套结构。我知道这不是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之间来回传递。

    1 回复  |  直到 14 年前
        1
  •  7
  •   Jeremy Brown    14 年前

    一旦知道了尺寸,就用工厂来定义结构。

    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()