我怎样才能将c_char_p值作为python3 ctypes中的字节获取?

时间:2017-01-11 14:47:38

标签: python c python-3.x ctypes

我在python3中有关于ctypes的问题。

我试图将c_char_p作为python bytes对象 以下代码试图将其值作为python3字节对象。

如何将其值作为字节对象?

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)

1 个答案:

答案 0 :(得分:1)

我自己找到了问题的答案。

根据官方Python ctypes文档,调用C函数默认返回整数。

因此,在调用C函数之前,请使用restype属性指定返回值的类型。

正确的代码示例:

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.)