自学内容网 自学内容网

python和C数据互转

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

Python -> C


原文地址:https://blog.csdn.net/tlxamulet/article/details/143524878

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!