2016-04-26 4 views
9

Ich möchte als Argument einer Funktion in meinem C-Modul ein Array von uint8_t übergeben.Wie behandelt man uint8_t auf einer Python-Erweiterung?

Ich konnte keine Methode finden, dieses Array direkt zu analysieren, also analysiere ich es zu einem PyObject_t und dann als ein PyTuple_t-Objekt. Auf diese Weise muss ich jedes Element PyObject_t dieses Tupels zu uint8_t umwandeln.

Wie kann ich das tun, sobald es keine PyInt_FromUINT8_t Funktion oder etwas ähnliches gibt?

Antwort

5

Sie können in der Regel einfach mit B mit unsigned char durchkommen. Nach Parsing Arguments sollten Sie nur in der Lage sein zu tun.

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

Wenn nicht direkt Argumente (zB Sie mit einem PyObject zu tun haben, einfach eine der PyInt_*, PyLong_* oder PyNumber_* Funktionen (https://docs.python.org/3/c-api/number.html?highlight=pynumber#c.PyNumber_AsSsize_t)

von einem uin8_t Umwandlung in eine PyObject ist ebenso einfach, Sie PyInt_FromLong oder PyLong_FromLong

+0

ich arbeite mit Arrays. In diesem Fall können eine PyTuple iterieren oder PyList PYIN mit t_FromLong wird keinen ungültigen Speicherzugriff verursachen? Diese Funktion versucht, 4 oder 8 Bytes zu lesen, aber jedem Element der Liste ist nur 1 Byte zugewiesen. –

+0

Keine der 'PyXXX'-Funktionen verwendet Zeiger auf ganze Zahlen, sondern gibt sie einfach als Wert zurück; So akzeptiert beispielsweise 'PyInt_FromLong' ein' int' als Argument und unterliegt normalen Typumwandlungen und ganzzahligen Koerzitien. Kannst du etwas mehr erklären, was du versuchst? –

+0

Ich habe die Frage aktualisiert. Überprüfen Sie, ob es jetzt klar ist. –

Verwandte Themen