gpt4 book ai didi

python - 将外部提供的缓冲区复制到字节的最有效方法是什么

转载 作者:太空狗 更新时间:2023-10-29 20:25:05 26 4
gpt4 key购买 nike

我正在使用 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]))

其中 bufc_void_plenc_int

据我了解,这会执行两个副本。一次到 bytearray 对象,然后再次到 bytes 对象。

我怎样才能只用一个副本来做到这一点?

我目前的工作集中在 Python 2 上,但在适当的时候我也需要为 Python 3 提供支持。

最佳答案

显然,您可以对 ctypes 指针进行切片。不是 c_void_pc_char_pc_wchar_p,但 POINTER 类型有效。对于 POINTER(c_char),对其进行切片可以得到 bytes:

data = ctypes.POINTER(ctypes.c_char).from_buffer(buf)[:len.value]

感谢 eryksun 提出这个问题。此外,还不清楚为什么 bufc_void_p 而不是已经是 POINTER(c_char)。 (对于 POINTER(c_char),代码将只是 buf[:len.value]。)


为了从支持缓冲协议(protocol)的通用对象中获取bytesmemoryview(...).tobytes()bytes( bytearray(...)):

data = memoryview(ctypes.cast(buf, ctypes.POINTER(ctypes.c_ubyte*len.value))[0]).tobytes()

这与 Python 2 和 Python 3 兼容。


请记住,这里的buf需要是指向缓冲区的指针,而不是指向缓冲区的指针。 getBuff 获取指向指针的指针(所以可能是 byref(buf))。

关于python - 将外部提供的缓冲区复制到字节的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43810423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com