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

Python中如何将socket接收的多条消息存储到类C++结构体中

实现方案

Python中可以通过dataclass(3.7及以上版本内置)模拟C的结构体,外层搭配list实现结构体数组的效果,使用体验和C写法几乎一致。


推荐方案:dataclass + list

1. 定义结构体与存储容器

from dataclasses import dataclass
from typing import List

# 模拟C++的CAN消息结构体,按需添加需要存储的属性
@dataclass
class CanMessage:
    timestamp: float
    arbitration: int
    # 其他需要存储的属性可直接往下加,例如:
    # data: bytes
    # dlc: int

# 动态长度存储容器,等价于C++的动态结构体数组
can_messages: List[CanMessage] = []

# 如果需要固定100条的定长数组,可预先初始化:
# can_messages = [None] * 100
# recv_count = 0

2. 接收消息并存入

注意原代码中类方法的self参数需要放在第一位:

def Receive(self, event):
    message = socket.recv(0.1)
    # 构造结构体实例并添加到存储列表
    can_msg = CanMessage(
        timestamp=message.timestamp,
        arbitration=message.arbitration
    )
    can_messages.append(can_msg)

    # 如果是用定长数组的写法,替换为:
    # global recv_count
    # if recv_count >= 100:
    #     return
    # can_messages[recv_count] = CanMessage(
    #     timestamp=message.timestamp,
    #     arbitration=message.arbitration
    # )
    # recv_count += 1

3. 读取使用

和C++结构体数组的访问方式完全一致:

# 读取第1条消息的时间戳,等价于C++的canmessage[0].timestamp
print(can_messages[0].timestamp)
# 读取第5条消息的仲裁id
print(can_messages[4].arbitration)

低版本Python兼容方案(3.7以下)

如果使用的Python版本不支持dataclass,可以用namedtuple替代,使用逻辑完全一致:

from collections import namedtuple

CanMessage = namedtuple("CanMessage", ["timestamp", "arbitration"])
# 后续存储、访问逻辑和dataclass方案完全相同

如果之前使用list和dict没有成功,大概率是没有封装成带属性的结构,用上述方案可以直接实现和C++结构体一致的使用体验。

内容的提问来源于stack exchange,提问作者sakthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 09:45:00