cyberRT离线数据解析

简介

    由于很多业务场景需要离线使用record数据包用于数据验证,所以离线解析record包输出为json,yaml,txt等文本文件就成了必然,基于cyberRT框架无此工具,所以此篇文章可以给出解决方案,源码经过验证,工程可实现.

方案

方案
  • 使用pbFactory = apollo::cyber::message::ProtobufFactory::Instance();初始化

  • 构造RecordReader(const std::string& file)对象recordReader

  • 通过RecordReader的成员函数GetHeader().is_complete()判断下Header是否完整

  • 如果完整通过recordReader->GetHeader()获得Header的引用header

  • 然后通过调用header的成员函数begin_time()等获取header的内容

  • 通过recordReader->GetChannelList()获取此离线数据包中的录制的通道名

  • 通过totalMsgNum = recordReader->GetMessageNumber(channelName);获取相应channel在次离线数据包中的数量

  • auto& msgType = recordReader->GetMessageType(channelName);获取当前channel数据结构prorobuf的msgType

  • auto protoDesc = recordReader->GetProtoDesc(channelName);获取当前channel数据定义protobuf文件内容的描述符,用于protobuf反射机制获取元素键值;

  • pbFactory->RegisterMessage(protoDesc);

  • recordReader->ReadMessage()通过此函数获取离线数据包中Message查看当前数据段类型,包含channelname

  • 通过google::protobuf::Message* rawMsgObj = nullptr;rawMsgObj = pbFactory->GenerateMessageByType(msgType);获得离线数据包中protobuf定义的原始数据,包含了元素键值对;

  • 通过const google::protobuf::Descriptor及const google::protobuf::Reflection等反射机制解析离线数据包中rawMsgObj,解析完成后即可输出到json,txt,yaml等文件中;

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值