Mithilfe von python-ctypes um Puffer von Schwimmern aus der gemeinsamen Bibliothek in python string
Ich versuche, python-ctypes zu verwenden, diese zwei C-Funktionen aus einer gemeinsam genutzten Bibliothek:
bool decompress_rgb(unsigned char *data, long dataLen, int scale)
float* getRgbBuffer()
Die erste Funktion ist in Ordnung. Ich kann sagen, durch die Umsetzung von einigen debug-code in der gemeinsam genutzten Bibliothek und der überprüfung der Eingabe.
Das problem ist die Daten aus. Der RGB-buffer ist ein Zeiger auf ein float (klar) und dieser Zeiger bleibt konstant während der Lebensdauer der Anwendung. Daher, Wann immer ich will zum entpacken ein Bild, ich nenne decompress_rgb
und müssen dann sehen, was auf die Lage spitzt sich zu, indem getRgbBuffer
. Ich weiß, dass die Puffer-Größe (720 * 288 * sizeof(float)) also, ich denke, dies hat ins Spiel kommen, irgendwo.
Gibt es keine c_float_p
geben, so dass ich dachte, ich würde versuchen Sie dies:
getRgbBuffer.restype = c_char_p
Dann weiß ich:
ptr = getRgbBuffer()
print "ptr is ", ptr
welche nur Ausgänge:
ptr = 3078746120
Ich vermute, dass ist die tatsächliche Adresse und nicht der Inhalt, aber selbst wenn ich erfolgreich dereferenzieren Sie den Zeiger und die Inhalte, es würde nur den ersten char.
Wie bekomme ich den Inhalt des gesamten Puffer in einem python-string?
Edit: ändern Musste:
getRgbBuffer.restype = c_char_p
zu
getRgbBuffer.restype = c_void_p
aber dann BastardSaint Antwort gearbeitet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht vollständig getestet, aber ich denke, es ist etwas entlang dieser Linie:
Schlüssel ist die
ctypes.memmove()
Funktion. Aus der ctypes Dokumentation:Nach dem obigen Schnipsel ausführen
rgb_buffer.value
zurückkehren wird, die Inhalte bis zur ersten'\0'
. Um alle bytes, die als python-string, können Sie schneiden die ganze Sache:buffer_contents = rgb_buffer[:]
.print rgb_buffer.value
druckt den Inhalt bis zum ersten null-Zeichen: >>> import ctypes >>> b = ctypes.create_string_buffer(10) >>> b.value = "a\0b' >>> b.Wert 'a' >>> b[:] 'a\x00b\x00\x00\x00\x00\x00\x00\x00' Vielleicht ist das, warum? Trotzdem, bin froh, dass es nun funktioniert 🙂Es ist schon eine Weile her, seit ich verwendet ctypes und ich don ' T haben etwas, das gibt einen "double *" handlich genug, um dies auszuprobieren, aber wenn Sie möchten, eine c_float_p:
Lesen BastardSaint die Antwort, Sie wollen einfach nur die raw-Daten, aber ich war nicht sicher, ob Sie dies tun, als ein workaround, um nicht mit einem c_float_p.