【发布时间】:2017-10-04 06:12:45
【问题描述】:
我正在使用 ctypes 连接到外部库。这个库返回给我一个二进制缓冲区。界面如下所示:
int getBuff(unsigned char **buf, int *len);
该库还导出了一个释放器,以便我在完成后可以释放缓冲区,但是这方面对我没有任何问题,所以我认为我们不需要覆盖它。
在我的 ctypes 代码中,我将 buf 参数表示为 c_void_p。我想尽可能高效地将此缓冲区复制到字节对象中。
目前我有:
data = bytes(bytearray(ctypes.cast(buf, ctypes.POINTER(ctypes.c_ubyte*len.value))[0]))
其中buf 是c_void_p 而len 是c_int。
据我了解,这会执行两个副本。一次到 bytearray 对象,然后再到 bytes 对象。
我怎样才能只用一个副本来做到这一点?
我目前的工作主要集中在 Python 2 上,但在适当的时候我也需要为 Python 3 提供支持。
【问题讨论】:
-
在 Python 3 上,您应该可以只删除
bytearray调用。 -
你为什么要使用带有演员表的
c_void_p而不仅仅是buf = POINTER(c_char)?然后getBuff(byref(buf), byref(len))和data = buf[:len.value]。 -
@eryksun:嗯。您可以切片 ctypes 指针吗?给我的消息。
-
@user2357112,它必须是
_Pointerinstance。简单指针类型(c_void_p、c_char_p、c_wchar_p)是_SimpleCData的子类,并且只有value。但我发现我的第一条评论中有错字。我错过了将其实例化为buf = POINTER(c_char)()的调用。 -
@eryksun 为什么?因为我不知道更好。一如既往地感谢您的知识贡献。
标签: python python-2.7 python-3.x ctypes