Utilizando el módulo ctypes, puedo importar fácilmente un puntero (c_char) o un tipo c_char_p en python, pero ninguno de estos proporciona una forma de terminar con una cadena de python que contiene bytes de valor cero.¿Cómo se convierte un char * con bytes de 0 valores en una cadena de Python?
c_char_p es cero terminado, lo que significa que una matriz char * de C termina en el primer valor cero.
POINTER (c_char) es la forma recomendada de importar datos binarios que pueden tener 0 valores, pero no parece haber una manera de convertir esto directamente en una cadena de Python.
Puedo hacer esto:
pixels = clibblah.get_pixels()
a = ""
for i in range(0, clibblah.get_pixel_length()):
a += pixels[i]
... pero esto 1) no parece muy pythony, y 2) se lleva para siempre (conversión de un bloque de datos de píxeles 640x480 toma unos 2 segundos en mi mac)
He visto un montón de preguntas sobre esto en el desbordamiento de la pila, pero zurcido si puedo ver uno que no dice "¿Por qué tienes que hacer eso?" o "c_char_p hará lo que quieras" (no lo hace, como he descrito anteriormente).
El único consejo creíble que he visto es el uso de la API de C PyString_FromStringAndSize, tal como se recomienda aquí: http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/FAQ.html
Realmente no puedo ver cómo eso ayuda embargo, debido a que yo sepa que es una característica Cython, no una pitón uno.
Para los interesados, la razón por la que necesito hacer esto es que estoy trabajando con panda3d y un kinect, y la aplicación kinect c proporciona una matriz de valores char * sin signo y la aplicación panda3d ofrece una llamada setPixels() eso solo toma una cadena de pitón como argumento.
Esto podría ayudar: http://stackoverflow.com/questions/5047536/how-do-i-build-a-python-string-from-a-raw-binary-ctype-buffer –
Se podría también ser útil para dar el código que desea que funcione pero no lo hace. Para que podamos tener una buena idea de cómo necesita/desea que todo se mantenga unido. –