2016-04-26 163 views
9

我想在我的C模块中传递一个函数参数uint8_t的数组。如何处理Python扩展中的uint8_t?

我找不到直接解析这个数组的方法,所以我将它解析成PyObject_t,然后作为PyTuple_t对象迭代。这样,我需要将这个元组的每个元素PyObject_t转换为uint8_t。

我该怎么做,一旦没有PyInt_FromUINT8_t函数或类似的东西?

回答

5

您通常可以使用unsigned charB脱身。据Parsing Arguments你应该能够做到:

uint8_t b; 
if (!PyArg_ParseTuple("b", &b)) { 
    return NULL; 
} 

如果不能直接使用的参数(例如,你正在处理一个PyObject,只需使用的PyInt_*PyLong_*PyNumber_*功能之一(https://docs.python.org/3/c-api/number.html?highlight=pynumber#c.PyNumber_AsSsize_t

uin8_t转换为PyObject也很简单,你可以使用PyInt_FromLongPyLong_FromLong

+0

我正在处理数组,在这种情况下,使用PyIn迭代PyTuple或PyList t_FromLong不会导致无效的内存访问? 此函数将尝试读取4或8个字节,但列表中的每个元素只分配1个字节。 –

+0

“PyXXX”函数都不使用指向整数的指针,而只是简单地按值返回;所以'PyInt_FromLong'例如会接受一个'int'作为参数,并且它会受到正常的类型转换和整数强制。你能解释一下你想做什么吗? –

+0

我更新了问题。检查它现在是否清楚。 –