Frage

Ich versuche, Python ctypes zu verwenden, um diese zwei C-Funktionen aus einer gemeinsam genutzten Bibliothek zu verwenden:

bool decompress_rgb(unsigned char *data, long dataLen, int scale)
float* getRgbBuffer()

Die erste Funktion funktioniert gut. Ich kann sagen, durch einige Debug-Code in der gemeinsam genutzten Bibliothek setzen und die Eingabe zu überprüfen.

Das Problem der Daten wird immer aus. Der RGB-Puffer ist ein Zeiger auf einen Schwimmer (offensichtlich) und dieser Zeiger bleibt während der Lebensdauer der Anwendung konstant. Deshalb, wenn ich ein Bild dekomprimieren will, rufe ich decompress_rgb und dann müssen sehen, was an der Stelle von getRgbBuffer hingewiesen. Ich weiß, dass die Puffergröße (720 * 288 * sizeof (float)), damit ich denke, das irgendwo ins Spiel kommen hat.

Es gibt keinen c_float_p Typ so dachte ich, ich würde versuchen, diese:

getRgbBuffer.restype = c_char_p

Dann ich:

ptr = getRgbBuffer()
print "ptr is ", ptr

, die nur ausgibt:

ptr = 3078746120

Ich vermute, das ist die tatsächliche Adresse, anstatt den Inhalt, aber selbst wenn ich erfolgreich wurde den Zeiger und bekommen den Inhalt dereferencing, wäre es nur das erste Zeichen sein.

Wie kann ich den Inhalt des gesamten Puffers in ein Python-String zu erhalten?

Edit: Wir hatten zu ändern:

getRgbBuffer.restype = c_char_p

getRgbBuffer.restype = c_void_p

aber dann BastardSaint Antwort gearbeitet.

War es hilfreich?

Lösung

nicht vollständig getestet, aber ich denke, es ist etwas entlang dieser Linie:

buffer_size = 720 * 288 * ctypes.sizeof(ctypes.c_float)
rgb_buffer = ctypes.create_string_buffer(buffer_size) 
ctypes.memmove(rgb_buffer, getRgbBuffer(), buffer_size)

Key ist die ctypes.memmove() Funktion. Aus der ctypes Dokumentation :

  

memmove(dst, src, count)
  Das gleiche wie die Standard-C-Bibliothek memmove Funktion: Kopien count von src Bytes dst. dst und src müssen ganze Zahlen oder ctypes Instanzen sein, die Zeiger umgewandelt werden können.

Nachdem das obige Snippet ausgeführt wird, rgb_buffer.value kehrt den Inhalt bis zum ersten '\0' auf. Um alle Bytes als Python-String zu erhalten, können Sie das Ganze in Scheiben schneiden. buffer_contents = rgb_buffer[:]

Andere Tipps

Es ist schon eine Weile her, seit ich ctypes verwendet und ich habe nicht etwas, was ein „double *“ handlich genug gibt diese zu testen, aber wenn Sie wollen eine c_float_p:

c_float_p = ctypes.POINTER(ctypes.c_float)

Beim Lesen BastardSaint Antwort, wollen Sie nur die Rohdaten, aber ich war nicht sicher, ob Sie tun, dass als Behelfslösung ein c_float_p nicht mit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top