Mit python ctypes und libc zu schreiben void Zeiger auf Binärdatei

Ich benutze Python-Ctypes und libc, um mit einer vom Hersteller gelieferten DLL-Datei zu kommunizieren. Der Zweck der DLL-Datei ist es, ein Bild von einer Kamera zu erwerben.

Die Bildaufnahme erscheint ohne Fehler; Das Problem, das ich habe, ist der Zugriff auf die Daten.

Die Bildaufnahmefunktion nimmt ein ctypes.c_void_p als Argument für die Bilddaten auf.

Vereinfacht wie folgt:

""" typedef struct AvailableData { void* initial_readout; int64 readout_count; } imageData; """ class AvailableData(ctypes.Structure): _fields_ = [("initial_readout", ctypes.c_void_p), ("readout_count", ctypes.c_longlong)] """ Prototype Acquire( CamHandle camera, int64 readout_count, int readout_time_out, AvailableData* available, AcquisitionErrorsMask* errors ); """ >>> imageData = AvailableData() >>> Acquire.argtypes = CamHandle, ctypes.c_longlong, ctypes.c_int, ctypes.POINTER(AvailableData), ctypes.POINTER(AcquisitionErrorsMask) >>> Acquire.restype = ctypes.c_void_p >>> status = Acquire(camera, readout_count, readout_time_out, imageData, errors) 

Ich verstehe nicht genau, was die Funktion macht, denn nach dem Ausführen der Funktion erscheint imageData.initial_readout ein Typ 'long' (nicht einmal ein ctypes.c_long: nur 'long'). Allerdings hat es auch einen Wert damit verbunden. Ich gehe davon aus, dass dies eine Startadresse ist, wo die Daten gespeichert sind.

 >>> type(imageData.initial_readout) <type 'long'> >>> imageData.initial_readout 81002560L 

Mein aktueller Ansatz für den Zugriff auf die Daten ist die Verwendung von libc.fopen, libc.fwrite, libc.fclose wie folgt:

 >>> libc = ctypes.cdll.msvcrt >>> fopen = libc.fopen >>> fwrite = libc.fwrite >>> fclose = libc.fclose >>> fopen.argtypes = ctypes.c_char_p, ctypes.c_char_p >>> fopen.restype = ctypes.c_void_p >>> fopen.restype = ctypes.c_void_p >>> fwrite.argtypes = ctypes.c_void_p, ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p >>> fwrite.restype = ctypes.c_size_t >>> fclose = libc.fclose >>> fclose.argtypes = ctypes.c_void_p, >>> fclose.restype = ctypes.c_int >>> fp = fopen('output3.raw', 'wb') >>> print 'fwrite returns: ',fwrite(ctypes.c_void_p(imageData.initial_readout), readoutstride.value, 1, fp) fwrite returns: 0 >>> fclose(fp) 

Wo readoutstride = 2097152 entspricht einem 1024×1024 Array von 16 Bit Pixeln.

Die Datei "output3.raw" erscheint im Windows Explorer, aber es hat 0 kByte und wenn ich versuche, es zu öffnen (zB mit einem imag Viewer) heißt es, dass die Datei leer ist.

Ich sehe, dass fwrite einen Wert von 0 zurückgibt (sollte aber einen Wert von 1 zurückgeben)

Wenn du irgendwelche Ideen hast, was ich hier falsch mache, schätze ich es immens. Vielen Dank im Voraus.

One Solution collect form web for “Mit python ctypes und libc zu schreiben void Zeiger auf Binärdatei”

argtypes restype argtypes , geben restype die Funktionen neu ein.

 import ctypes libc = ctypes.windll.msvcrt fopen = libc.fopen fopen.argtypes = ctypes.c_char_p, ctypes.c_char_p, fopen.restype = ctypes.c_void_p fwrite = libc.fwrite fwrite.argtypes = ctypes.c_void_p, ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p fwrite.restype = ctypes.c_size_t fclose = libc.fclose fclose.argtypes = ctypes.c_void_p, fclose.restype = ctypes.c_int fp = fopen('output3.raw', 'wb') fwrite('Hello', 5, 1, fp) fclose(fp) 
Python ist die beste Programmiersprache der Welt.