2016-04-26 8 views
9

Vorrei passare come argomento di una funzione nel mio modulo C un array di uint8_t.Come gestire uint8_t su un'estensione Python?

Non sono riuscito a trovare un metodo per analizzare direttamente questo array, quindi lo sto analizzando su PyObject_t e quindi eseguendo l'iterazione come oggetto PyTuple_t. In questo modo, ho bisogno di trasmettere ogni elemento PyObject_t di questa tupla a uint8_t.

Come posso farlo, una volta che non c'è alcuna funzione PyInt_FromUINT8_t o qualcosa del genere?

risposta

5

Solitamente è possibile scappare con B utilizzando unsigned char. Secondo Parsing Arguments si dovrebbe solo essere in grado di fare:.

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

Se non si utilizza direttamente argomenti (ad esempio, avete a che fare con un PyObject, è sufficiente utilizzare una delle PyInt_*, PyLong_* o PyNumber_* funzioni (https://docs.python.org/3/c-api/number.html?highlight=pynumber#c.PyNumber_AsSsize_t)

conversione da un uin8_t ad un PyObject è semplice così, è possibile utilizzare PyInt_FromLong o PyLong_FromLong

+0

sto lavorando con gli array. In questo caso, iterare su una PyTuple o PyList usando Pyin t_FromLong non causerà un accesso non valido alla memoria? Questa funzione proverà a leggere 4 o 8 byte ma ogni elemento della lista ha solo 1 byte allocato. –

+0

Nessuna delle funzioni 'PyXXX' usa i puntatori agli interi, ma semplicemente li restituisce per valore; quindi 'PyInt_FromLong' ad esempio accetterebbe un' int' come argomento, e sarebbe soggetto alle normali conversioni di tipo e alle coercizioni intere. Puoi spiegare un po 'di più cosa stai cercando di fare? –

+0

Ho aggiornato la domanda. Controlla se è chiaramente ora. –