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
相关产品推荐
相关产品推荐

