Python类中嵌套ctypes结构体转bytearray触发TypeError问题
解决ctypes结构体类作为Python类属性时转bytearray的TypeError问题
问题场景
直接定义并实例化ctypes结构体时,能正常转为bytearray:
from ctypes import * class get_log_input_payload(Structure): _pack_ = 1 _fields_ = ( ("log_identifier",c_uint8*16), ("offset",c_uint32), ("length",c_uint32) ) payload = get_log_input_payload() b_array = bytearray(payload)
但将ctypes结构体类作为Python类的属性时,调用bytearray()会抛出错误:TypeError: cannot convert '_ctypes.PyCStructType' object to bytearray,报错代码如下:
from ctypes import * class Mailbox: get_log_input_payload = type("get_log_input_payload", (Structure, ), {"_fields_" : [("log_identifier",c_uint8*16), ("offset",c_uint32), ("length",c_uint32)]}) obj = Mailbox() payload = obj.get_log_input_payload b_array = bytearray(payload) # <--- 触发错误
错误原因
payload = obj.get_log_input_payload获取的是ctypes结构体类本身(类型为_ctypes.PyCStructType),而bytearray()只能接收ctypes结构体的实例对象,而非类,因此抛出类型转换错误。
另外,报错代码中定义结构体时缺少_pack_ = 1,可能会导致内存对齐问题,建议补充该属性保证结构体字节布局一致。
解决方案
需要对结构体类进行实例化,再传入bytearray(),同时补充_pack_属性:
from ctypes import * class Mailbox: get_log_input_payload = type("get_log_input_payload", (Structure, ), { "_pack_": 1, "_fields_" : [ ("log_identifier",c_uint8*16), ("offset",c_uint32), ("length",c_uint32) ] }) obj = Mailbox() payload = obj.get_log_input_payload() # 加括号实例化结构体 b_array = bytearray(payload) # 正常转换
内容的提问来源于stack exchange,提问作者DHARMESH PITRODA
相关产品推荐
相关产品推荐

