2012-01-16 18 views
6

Sto tentando di eseguire il cast di un puntatore const char char [] di stringa C (restituito da una DLL) in un tipo di stringa compatibile con Python. ma quando Python27 esegue:casting in una stringa Python da un char [] restituito da una DLL

import ctypes 

charPtr = ctypes.cast("HiThere", ctypes.c_char_p) 
print("charPtr = ", charPtr) 

otteniamo: charPtr = c_char_p('HiThere')

forse qualcosa non è da valutare in modo corretto. Le mie domande sono:

  1. come si dovrebbe lanciare questo charPtr in una stringa stampabile compatibile con Python?
  2. è l'operazione di cast appena menzionata che fa ciò che dovrebbe fare?

risposta

9

ctypes.cast() viene utilizzato per convertire un'istanza di tipo cty in un altro tipo di dati di tipo ctype. Non ne hai bisogno Per convertirlo in una stringa python. Basta usare ".value" per ottenerlo nella stringa python.

>>> s = "Hello, World" 
>>> c_s = c_char_p(s) 
>>> print c_s 
c_char_p('Hello, World') 
>>> print c_s.value 
Hello, World 

Maggiori informazioni here

+0

sì. Ho modificato un po '. Sto aggiornando correttamente. –

5

Se si impostano le argtypes o restype attributi di ctypes funzioni, torneranno l'oggetto Python destra senza la necessità di un cast.

Ecco un esempio di chiamare il C-runtime time e ctime funzioni:

>>> from ctypes import * 
>>> m=CDLL('msvcrt') 
>>> t=c_long(0) 
>>> m.time(byref(t)) 
1326700130 
>>> m.ctime(byref(t)) # restype not set 
6952984 
>>> m.ctime.restype=c_char_p # set restype correctly 
>>> m.ctime(byref(t)) 
'Sun Jan 15 23:48:50 2012\n' 
+0

Python gestisce il ciclo di vita del char restituito *? –

+0

@HelinWang no, non è così. In questo caso 'ctime' restituisce un puntatore alla memoria statica, quindi non c'è nulla da gestire. –

+0

Sai del caso generale? : la libreria c ha restituito una memoria allocata nell'heap. –

Problemi correlati