2016-04-26 23 views
9

C modülümde bir işlevin argümanı olarak uint8_t'in bir dizisini iletmek istiyorum.Bir Python Uzantısında nasıl uint8_t ile başa çıkılır?

Bu diziyi doğrudan ayrıştırmak için bir yöntem bulamadım, bu yüzden bir PyObject_t dosyasına ayrıştırarak PyTuple_t nesnesi olarak yinelemeyi yapıyorum. Bu şekilde, bu parçanın PyObject_t öğesinin her birini uint8_t'ye dökmem gerekiyor.

PyInt_FromUINT8_t işlevi veya benzeri bir şey olmadığında bunu nasıl yapabilirim?

cevap

5

unsigned char kullanarak B ile genellikle uzaklaşabilirsiniz. Parsing Arguments göre sadece yapmak mümkün olmalıdır.

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

doğrudan örneğin bir PyObject ilgileniyor argümanları (kullanmıyorsanız, basitçe) PyInt_*, PyLong_* veya PyNumber_* işlevlerden birini (https://docs.python.org/3/c-api/number.html?highlight=pynumber#c.PyNumber_AsSsize_t kullanmak

bir PyObject bir uin8_t dönüştürme

Ben dizilerle birlikte çalışıyorum. Bu durumda
+0

bir PyTuple üzerinde yineleme ya PyList Pyin kullanarak PyInt_FromLong veya PyLong_FromLong kullanabilirsiniz yanı basittir t_FromLong geçersiz bir bellek erişimine neden olmaz mı? Bu işlev 4 veya 8 bayt okumaya çalışacaktır, ancak listenin her öğesi yalnızca 1 bayt ayrılmıştır. –

+0

'PyXXX' işlevlerinin hiçbiri, tamsayılara işaretçiyi kullanmaz; Yani 'PyInt_FromLong' örneğin bir 'int' argümanı olarak kabul ederdi ve normal tip dönüşümleri ve tamsayı koersiyonlarına tabi olurdu. Ne yapmaya çalıştığını biraz daha açıklayabilir misin? –

+0

Soruyu güncelledim. Şimdi açık olup olmadığını kontrol et. –

İlgili konular