ctypes c_char_p erweitern

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Zuzu_Typ
User
Beiträge: 12
Registriert: Montag 17. Juli 2017, 22:14

Ich bin erneut auf ein Problem gestoßen,

ich habe folgenden C++ code:

Code: Alles auswählen

buffer.insert(buffer.end(), array, array + bytes);
und habe ich dann so "übersetzt":

Code: Alles auswählen

if buffer.value != None:
    buffer.value += array.value
else:
    buffer.value = array.value
- was natürlich nicht funktioniert, da c_char_p.value alle NULLs weglässt (und obendrein erscheint es mit unschön)

(möglicher Weise nicht notwendige Info:) array und buffer sind beide vom typ c_char_p, wobei array ein pointer() zu einem 32768*c_char array ist und buffer zunächst ein leerer c_char_p, der dann immer wieder mit array befüllt werden soll.

wie kann ich also einen c_char_p um den "inhalt" eines anderen c_char_p erweitern?

Danke für die Hilfe.
Beste Grüße,
--Zuzu_Typ--
Zuletzt geändert von Anonymous am Samstag 22. Juli 2017, 18:27, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Du kannst `.raw` anstelle von `.value` benutzen:

Code: Alles auswählen

buffer = create_string_buffer(length)
some_array = create_string_buffer(some_bytes)
buffer.value += some_array.raw[:some_length]
Setzt vorraus, dass `buffer` nullterminiert, also ein C-String ist. Falls das nicht der Fall ist, musst Du explicit die Position angeben, wo eingesetzt/überschrieben werden soll.
Zuzu_Typ
User
Beiträge: 12
Registriert: Montag 17. Juli 2017, 22:14

Danke für den Tipp!

Ich verwende einfach cast um den c_char_p array in einen POINTER(c_char*32768) zu verwandeln,
dann komme ich an das .raw tag ran.

TYVM

--EDIT

Ich hab jetzt einfach buffer durch ein bytes objekt ersetzt (und diesen mit dem neu erlernten .raw befüllt) und jetzt funktioniert es.
Wow. Ich hatte echt meine Zweifel, dass ich jemals eine OGG Vorbis Datei in Python öffnen, laden und per OpenAL wiedergeben könnte.
Jetzt hab ich nur noch Opus und Wave vor mir :)
Antworten