在Python中访问空指针(使用SWIG或其他方式)

在Python中访问空指针(使用SWIG或其他方式),python,pointers,swig,void,Python,Pointers,Swig,Void,我一直在尝试使用SWIG封装一个简单的库,该库使用ioctl()来填充如下结构: struct data { header* hdr; void* data; size_t len; }; data是指向缓冲区的指针,len是该缓冲区的长度 我不知道如何将数据转换为Python字符串(或数组)。此外,我需要一种方法来释放析构函数中的缓冲区。感谢您的任何建议。因为您在Q的标题中说了“或其他东西”——如果您选择使用,您可以使用c\u void\u p(其中一个ctypes)表示void

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

struct data
{
  header* hdr;
  void* data;
  size_t len;
};
data是指向缓冲区的指针,len是该缓冲区的长度

我不知道如何将数据转换为Python字符串(或数组)。此外,我需要一种方法来释放析构函数中的缓冲区。感谢您的任何建议。

因为您在Q的标题中说了“或其他东西”——如果您选择使用,您可以使用
c\u void\u p
(其中一个ctypes)表示
void*
,并从c运行时库访问
free
memcpy
等函数(只要后者是一个DLL/.so动态库,但现在这种情况非常普遍。)要获得一个可变字符缓冲区,您可以
memcpy
数据,请使用

当然,您也可以使用Python C API——在本例中,您将使用该API从
void*
和length创建字节数组副本(当然,在适当的时候,您可以直接调用
free
,因为它只是C代码)

另一个可能考虑的是,一种设计Python语言的Python语言,它使Cython编译器可以从Cython源生成可编译的C代码——在Cython,你的代码> Stutt将是:

cdef struct data:
    void* hdr
    void* data
    unsigned int* len
假设您不想麻烦地声明
标题
(也就是说,这里只有
数据
len
对您很重要)--
大小_t
,我相信,现在不是Cython的一部分(我可能是错的,他们会不断添加东西;-),但是
无符号int
可能可以

对不起,我已经很久没有认真使用SWIG了(有这么多优秀的替代品)——如果不是因为标题中那个诱人的“或其他东西”子句,我会跳过Q;-)。

因为你说“或其他东西”在Q的标题中——如果你选择使用,你可以用
c\u void\u p
(ctypes之一)来表示
void*
,并从c运行时库中访问
free
memcpy
等函数(只要后者作为DLL/可用。所以是动态库,但现在这种情况非常普遍)。要获取可变字符缓冲区,您可以
memcpy
将数据放入其中,请使用

当然,您也可以使用Python C API——在本例中,您将使用该API从
void*
和length创建字节数组副本(当然,在适当的时候,您可以直接调用
free
,因为它只是C代码)

另一个可能考虑的是,一种设计Python语言的Python语言,它使Cython编译器可以从Cython源生成可编译的C代码——在Cython,你的代码> Stutt将是:

cdef struct data:
    void* hdr
    void* data
    unsigned int* len
假设您不想麻烦地声明
标题
(也就是说,这里只有
数据
len
对您很重要)--
大小_t
,我相信,现在不是Cython的一部分(我可能是错的,他们会不断添加东西;-),但是
无符号int
可能可以


对不起,我已经很久没有认真使用SWIG了(因为有这么多优秀的替代品)——如果不是因为标题中那个诱人的“或其他东西”子句,我会跳过Q;-)。

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

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


使用此模块处理二进制数据变得非常简单。我希望这就是您所需要的。

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

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


使用此模块处理二进制数据变得非常简单。我希望这就是您所需要的。

谢谢提示!我目前正在游荡到Cython,看起来很有希望。谢谢提示!我目前正在游荡到Cython,看起来很有希望。