如何将Python 2.7中的二进制数据正确传递给C模块

1 投票
1 回答
755 浏览
提问于 2025-04-17 14:52

我正在用Python从一个文件中读取二进制数据,然后想把这些数据发送到一个C语言模块。在Python中,数据是这样读取的:

file = open("data", "rb")
data = file.read()

我希望在C语言中能得到一个指向缓冲区的指针和数据的长度。如果可以的话,我在C模块中使用PyArg_ParseTuple来获取参数。我注意到在Python 3及以上版本中,有一种y/y*/y#的格式说明符可以用来处理二进制数据,但我需要在Python 2.7中找到类似的方法。

谢谢

1 个回答

2

你应该了解一下缓冲区接口

根据文档的说明:

这些函数可以让一个对象以原始的、字节为基础的格式来展示它的数据。对象的使用者可以通过缓冲区接口直接访问这些数据,而不需要先复制一份。

支持缓冲区接口的对象有两个例子:字符串和数组。字符串对象可以以字节形式展示它的字符内容。数组也可以展示它的内容,但需要注意的是,数组的元素可能是多个字节的值。

举个例子(用C++语言):

void* ExtractBuffer(PyObject* bufferInterfaceObject, Py_buffer& bufferStruct)
{
    if (PyObject_GetBuffer(bufferInterfaceObject, &bufferStruct, PyBUF_SIMPLE) == -1)
        return 0;

    return (void*)bufferStruct.buf;
}

当你不再需要bufferStruct的时候,别忘了释放它:

PyBuffer_Release(&bufferStruct);

撰写回答