You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:50:13