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

如何将C语言的Items_Info_t结构体转换为Python dataclass并使用struct.pack实现序列化?

如何将C语言的Items_Info_t结构体转换为Python dataclass并使用struct.pack实现序列化?

我来帮你一步步搞定这个问题,从C结构体转Python等价实现,到用struct.pack完成序列化,都给你讲得明明白白。

首先处理C结构体的Python转换部分:
你原本写的普通类加类型注解思路是对的,但更推荐用Python的dataclass来模拟C结构体——它自带初始化、打印等实用方法,写法也更贴近C结构体的简洁风格,用起来顺手多了。

对应你给出的C结构体:

MAX_NUMBER_OF_ITEMS = 9

typedef struct {   
   uint64_t status;    
   uint8_t serial_number_of_items [MAX_NUMBER_OF_ITEMS];   
   uint8_t version;
} Items_Info_t;

Python的等价实现可以这么写:

from dataclasses import dataclass
from typing import List

MAX_NUMBER_OF_ITEMS = 9

@dataclass
class ItemsInfo:
    status: int  # 对应C的uint64_t,取值范围0~2^64-1
    serial_number_of_items: List[int]  # 对应固定长度为9的uint8_t数组,每个元素0~255
    version: int  # 对应C的uint8_t,取值范围0~255

这里要特别注意:serial_number_of_items必须是长度为9的列表,每个元素得是0到255之间的整数,不然序列化的时候会出问题。

接下来是核心的序列化部分,用struct.pack把Python对象转成和C结构体一致的字节流:
struct模块的关键是格式字符串,我们得严格对应C类型的字节长度和顺序:

  • uint64_t对应格式字符Q
  • 每个uint8_t对应格式字符B
  • 跨平台序列化时一定要指定固定字节序(比如小端<、大端>),别用默认的本机字节序,不然不同机器解析会乱套。

我给你写了带参数校验的完整序列化函数,能提前避免数组长度不对的问题:

import struct

def serialize_items_info(info: ItemsInfo) -> bytes:
    # 先校验数组长度,确保和C结构体的固定长度一致
    if len(info.serial_number_of_items) != MAX_NUMBER_OF_ITEMS:
        raise ValueError(f"serial_number_of_items必须恰好有{MAX_NUMBER_OF_ITEMS}个元素")
    
    # 构造格式字符串:这里用小端字节序,你可以根据需求换成大端'>'
    format_str = f"<Q{MAX_NUMBER_OF_ITEMS}BB"
    # 打包参数:status是64位整数,展开数组的9个元素,最后是version
    return struct.pack(format_str, info.status, *info.serial_number_of_items, info.version)

最后给你一个测试用例,看看实际运行效果:

# 创建一个测试用的ItemsInfo实例
test_info = ItemsInfo(
    status=0x123456789abcdef0,  # 一个64位的十六进制数
    serial_number_of_items=[1, 2, 3, 4, 5, 6, 7, 8, 9],  # 正好9个元素
    version=0x01  # 版本号1
)

# 序列化
serialized_data = serialize_items_info(test_info)
print(f"序列化后的字节串(十六进制):{serialized_data.hex()}")

一些要留意的细节

  • 字节序必须和C端保持一致:如果C那边用小端解析,Python就用<;大端就用>,千万别搞混
  • 数值范围要合法:status不能超过64位无符号整数的最大值(18446744073709551615),serial_number_of_items和version的元素必须是0-255之间的整数
  • 如果你的C结构体用了__attribute__((packed))(取消内存对齐),那上面的格式字符串完全没问题;如果C结构体有默认对齐,可能需要在格式字符串里加对应填充字节,但跨平台序列化一般都会用packed结构体,所以这个情况大概率不用操心

备注:内容来源于stack exchange,提问作者user29971104

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:48:05