ctypes和指针操作

ctypes和指针操作

问题描述:

我正在处理图像缓冲区,我希望能够访问数据到我的图像几行用c库进行分析。我使用create_string_buffer在Python中创建了我的8位像素缓冲区。有没有办法在不重新创建新缓冲区的情况下获取指向该缓冲区中某个位置的指针?我的目标是以块为单位分析和更改该缓冲区中的数据,而无需进行大量的缓冲区创建和数据复制。ctypes和指针操作

在这种情况下,最终,C库正在完成对缓冲区的所有操作,所以实际上我不必使用Python更改缓冲区中的值。我只需要让我的C函数访问缓冲区中的数据。

create_string_buffer给你一个ctypes对象(字符数组),然后byref,我引用,

返回一个重量轻的指针到obj, 它必须是一个ctypes 类型的实例。偏移量默认为零,并且 必须是一个整数,它将被添加到内部指针值 。

offset参数已在2.6中添加,因此如果您遇到较旧的版本,您将不幸需要更多工作。

+0

有一点是有点混乱,though--假如我做了以下内容: “BUFF = create_string_buffer(10)”。会传递“byref(buff,3)”pass“&(buff [3])”或“(&buff)+ 3)”? – Chris 2010-03-22 18:30:38

+0

@Chris,这两个表达式是等价的 - 在C中,&X [Y] == X + Y'是任何指针X(数组“衰减到C中的指针”)和整数Y的重言式。(这里,数组的项目每个都是1个字节,所以在指针算术中对“缩放”没有任何疑问;-)。 – 2010-03-22 20:56:26

+0

我意识到它们在C中是等价的,但我不确定ctypes会如何回应......换句话说,它会传递指针加3,还是指向python实例增加3,或者是奇怪的东西那。然而,像往常一样,python非常聪明,并且将C指针加3。谢谢您的帮助! – Chris 2010-03-30 14:31:00

您还可以使用ctypes.cast(buf, ctypes.c_void_p)

+0

使用'.byref()',“返回的对象只能用作外部函数调用参数”的FYI看起来好像它不让我在缓冲区中设置偏移量。我错过了什么? – Chris 2010-03-22 18:26:54