C -> Python
从C返回的地址获得一个int
value = ctypes.c_int.from_address(addr)
得到一个c_int。
再调用c_int.value属性得到python int。
从C返回的地址获得一个struct
比如下面的结构:
class DynamicListType(ctypes.Structure):_fields_ = [("count", c_int), ("elems", ctypes.POINTER(c_int))]
同样使用from_address获得对象:
DynamicListType.from_address(addr)
返回的就是一个DynamicListType实例,可直接访问其count和elems成员。
从C返回的地址获得一个函数指针
# 这里func_ptr是一个整型地址,用CFUNCTYPE函数对其做强转,可获得一个可执行的函数指针(类型是CFuncPtr),执行该函数,可得到结果
cfunc = CFUNCTYPE(return_type, *arg_types)(func_ptr)
func_res = cfunc(*args)
上述cfunc返回的结果,python框架做过处理,像整型、浮点型、字符串等基本类型都转成了python的基本类型int、float、bytes。
复杂的结构则转成ctypes里定义的类型,比如:
LP_c_char_p_Array_2,代表[char* x 2]* ,我们要用contents获取指针内容,得到[char* x 2],也就是python里的bytes*2