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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值