ctypes: return (und übergeben) von byte array mit null bytes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo,
ein Problem, wo ich schon länger herumprobiere:

Wenn ich aus einer C/C++ Funktion ein byte array zurückliefern will, gehe ich folgendermassen vor:

zb Auszug aus C: (Werte habe ich jetzt direkt gesetzt, um leichter testen zu können)

Code: Alles auswählen

char read_buffer [1024];
DLLEXPORT char* StorageReadString(int offset, int size)
{
  read_buffer[0] = 'a';
  read_buffer[1] = 'b';
  read_buffer[2] = '\0';
  read_buffer[3] = 'a';
  read_buffer[4] = '\0';
  return read_buffer;
}
in python dann:

Code: Alles auswählen

mydll.StorageReadString.restype = ctypes.c_char_p
str = mydll.StorageReadString(offset, size)
for i in range(size):
    print i, ord(str[i])
return str
Jetzt schneidet er ab dem ersten Null byte weg, und übrig bleibt dann "ab". Wie kann ich erreichen, dass er alle Bytes zurückliefert? Und dann habe ich ab dem dritten Byte natürlich einen index error.

Er müsste das nicht als string sehen, sondern als allgemeines byte array. Aber wie mache ich das in ctypes?

Zusatzfrage: Wie kann ich so ein array mit Nullbytes an C mit ctypes überreichen?
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Ah, ich glaube ich komme dem ganzen doch etwas näher.

Anscheinend hat man doch die Möglichkeit als restype einen pointer anzugeben, in der Art von:
<meine c funktion>.restype = ctypes.POINTER(ctypes.c_byte) zb

Ja, so funktioniert das.
Antworten