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

访问python中的空指针(使用swig或其他方法)

  •  1
  • Delyan  · 技术社区  · 16 年前

    我一直在尝试使用swig来包装一个使用ioctl()填充如下结构的简单库:

    struct data
    {
      header* hdr;
      void* data;
      size_t len;
    };
    

    数据 是指向缓冲区的指针, 伦恩 是缓冲区的长度。

    我不知道怎么转换 数据 到python字符串(或数组)。此外,我需要一种方法来释放析构函数中的缓冲区。如有任何建议,我们将不胜感激。

    2 回复  |  直到 12 年前
        1
  •  1
  •   Alex Martelli    16 年前

    既然你在Q的标题中说“或者其他什么”—如果你选择使用 ctypes ,您可以表示 void* 具有 c_void_p (CyType) fundamental data types 和访问功能,如 free memcpy 从C运行时库(只要后者可以作为一个dll/.so动态库使用,但现在这种情况非常普遍)。获取一个可变的字符缓冲区 曼皮西 数据,使用 create_string_buffer .

    当然,您也可以使用python c api-- PyByteArray_FromStringAndSize 在本例中,您将使用它从 空洞* 和长度(当然你会打电话给 自由的 直接,在适当的时候,因为它只是C代码)。

    另一个需要考虑的可能性是 Cython 是一种类似于python的语言,设计用于编写python扩展,这样cython编译器就可以从cython源代码生成可编译的C代码-在cython中, struct 将是:

    cdef struct data:
        void* hdr
        void* data
        unsigned int* len
    

    假设你不想麻烦去申报 header (也就是说,只有 data len 这里对你很重要)-- size_t 我相信,现在不是赛通的一部分(我可能错了,他们一直在添加东西;-),但是 unsigned int 可能可以。

    对不起,我已经很久没有认真地使用swig了(所有这些优秀的选项都是什么)--如果不是因为标题中的诱人的“或其他”条款,我会跳过q;-。

        2
  •  1
  •   BenMorel Manish Pradhan    12 年前

    swig提供了一个名为“cdata.i”的模块。您应该将其包含在接口定义文件中。

    一旦包含了它,它将提供两个函数cdata()和memmove()。给定一个void*和二进制数据的长度,cdata()将其转换为目标语言的字符串类型。memmove()是相反的。给定一个字符串类型,它将把字符串的内容(包括嵌入的空字节)复制到C void*类型中。

    使用这个模块,处理二进制数据变得非常简单。我希望这是你需要的。

    推荐文章