2017-01-11 4 views
0

J'ai une question à propos de ctypes dans python3.Comment puis-je obtenir la valeur de c_char_p en octets dans les ctypes python3?

J'essaie d'obtenir un c_char_p en tant qu'objet python bytes.
Le code suivant tente d'obtenir sa valeur en tant qu'objet python3 octets.

Comment obtenir sa valeur en tant qu'objet octets?

from ctypes import * 

libc = cdll.LoadLibrary("libSystem.B.dylib") 
s1 = create_string_buffer(b"abc") # create a null terminated string buffer 
s2 = create_string_buffer(b"bc") # same at above 


g = libc.strstr(s1, s2) # execute strstr (this function return character pointer) 
print(g) # print the returned value as integer 
matched_point = c_char_p(g) # cast to char_p 
print(matched_point.value) # trying to getting value as bytes object (cause segmentation fault here) 
+0

semble correct et cela a fonctionné pour moi. Étrange. Et 'g' n'est pas un pointeur nul? –

Répondre

0

J'ai moi-même trouvé une réponse à la question.

Selon la documentation officielle de Python ctypes, appelée fonction C renvoyer l'entier par défaut. Par conséquent, avant d'appeler la fonction C, spécifiez le type de valeur de retour avec l'attribut restype.

exemple de code correct:

from ctypes import * 

libc = cdll.LoadLibrary("libSystem.B.dylib") 
s1 = create_string_buffer(b"abc") # create a null terminated string buffer 
s2 = create_string_buffer(b"bc") # same at above 


libc.strstr.restype = c_char_p # specify the type of return value 

g = libc.strstr(s1, s2) # execute strstr (this function return character pointer) 
print(g) # => b"bc"  (g is bytes object.) 
code
+0

En outre, utilisez 'libc.strstr.argtypes = c_char_p, c_char_p' et appelez simplement avec' g = libc.strstr (b'abc ', b'bc') '. Vous avez seulement besoin de 'create_string_buffer' pour créer un tampon inscriptible. 'strstr' prend des pointeurs char const, donc ce n'est pas nécessaire. –