如何使用ctypes初始化结构体中的固定大小字符数组字段?
解决ctypes初始化含固定大小字符数组结构体的问题
你碰到的这个错误,核心原因是用关键字参数初始化结构体时,ctypes期望传入bytes类型的值,而不是你手动创建的c_char_Array_32对象。下面给你几个实用的解决办法:
方法一:直接传入bytes字符串
不需要提前构建数组对象,直接把bytes格式的字符串传给结构体字段即可。ctypes会自动帮你把内容填充到固定大小的数组里——如果字符串长度不足32,会自动补\x00;超出的部分则会被截断:
import ctypes class MyStructure(ctypes.Structure): _fields_ = [("a", ctypes.c_char * 32)] # 直接传入bytes字符串完成初始化 mystruct = MyStructure(a=b"Hi!")
方法二:先实例化结构体再赋值数组
如果已经有了c_char_Array_32类型的对象,可以先创建空的结构体实例,再把数组对象赋值给对应字段:
import ctypes class MyStructure(ctypes.Structure): _fields_ = [("a", ctypes.c_char * 32)] a = (ctypes.c_char * 32)(*b"Hi!") mystruct = MyStructure() mystruct.a = a # 直接将数组对象赋值给结构体字段
方法三:用内存拷贝精确控制内容
如果需要更精细地控制数组的填充内容,可以借助memmove来完成数据拷贝:
import ctypes class MyStructure(ctypes.Structure): _fields_ = [("a", ctypes.c_char * 32)] data = b"Hi!" mystruct = MyStructure() # 把bytes数据拷贝到数组中,避免超出数组长度 ctypes.memmove(mystruct.a, data, min(len(data), 32))
额外提示
在调用C++ DLL时,这类固定大小字符数组通常用来存储字符串。后续如果要从结构体中读取字符串,直接用mystruct.a.decode('utf-8')就能把字节数组转换成Python字符串啦。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

