Python中如何将数字列表转换为ctypes数组传入C函数
ctypes 转换0-255数字列表为unsigned char* 指针的实现方案
ctypes 中对应C语言unsigned char(无符号单字节,取值0~255)的类型是c_ubyte,你只需要根据Python列表的长度动态生成对应长度的ctypes数组类型,再拆包传入列表元素完成初始化即可。这种方式生成的是连续内存存储的纯字节数组,数值0会被作为普通有效字节存储,不会被识别为字符串终止符截断,完全匹配C函数的入参要求。
完整示例代码
import ctypes # 原始Python列表数据 user_data = [1, 255, 30, 100, 0, 12, 5, 216] # 生成对应长度的unsigned char数组,用列表元素初始化 c_byte_arr = (ctypes.c_ubyte * len(user_data))(*user_data) # 直接传入C函数即可,ctypes会自动将数组退化为指向首地址的unsigned char*指针 # 假设你已经通过ctypes加载了对应C库,实例名为c_lib res = c_lib.c_function(c_byte_arr)
关键注意点
- 不要使用
c_char_p类型直接传入Python字符串或bytes对象:如果C函数会修改传入的内存段,Python不可变的bytes/str对象会直接触发内存访问崩溃;且部分场景下c_char_p的处理逻辑会自动在0值处截断,不符合字节数组的传参要求。 - 如果你能确认C函数只会只读访问传入的内容、不会修改内存,也可以直接将列表转为Python原生bytes对象传入:
c_byte = bytes(user_data),但优先推荐c_ubyte数组的实现方案,兼容性更强,也支持C侧对数组内容的修改操作。 - 生成的
c_byte_arr是ctypes原生数组对象,支持直接通过下标读写对应位置的字节值,和C侧数组操作逻辑完全一致。
内容的提问来源于stack exchange,提问作者JING
相关产品推荐
相关产品推荐

