2016-04-26 10 views
9

Я хотел бы передать в качестве аргумента функции в моем модуле C массив uint8_t.Как работать с uint8_t на расширении Python?

Я не мог найти метод для непосредственного анализа этого массива, поэтому я разбираю его в PyObject_t и затем повторяю как объект PyTuple_t. Таким образом, мне нужно передать каждый элемент PyObject_t этого кортежа в uint8_t.

Как это сделать, если нет функции PyInt_FromUINT8_t или что-то в этом роде?

ответ

5

Вы можете просто уйти с B, используя unsigned char. По 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_FromLong или PyLong_FromLong

+0

Я работаю с массивами. в этом случае перебрать PyTuple или PyList использованием Pyin t_FromLong не приведет к недопустимому доступу к памяти? Эта функция попытается прочитать 4 или 8 байт, но каждый элемент списка имеет только 1 байт. –

+0

Ни одна из функций 'PyXXX' не использует указатели для целых чисел, а просто возвращает их по значению; поэтому 'PyInt_FromLong', например, примет аргумент' int', и он будет подвержен нормальным преобразованиям типов и целым силам. Можете ли вы объяснить немного больше, что вы пытаетесь сделать? –

+0

Я обновил вопрос. Проверьте, ясно ли это сейчас. –