2016-04-26 59 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

我更新了問題。檢查它現在是否清楚。 –