我在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)
答案 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.)