Proto文件的解析与C++项目

本文详细介绍了如何从下载Google项目开始,通过安装CMake和Protobuf,完成Proto文件的解析并生成代码文件。随后,指导读者如何在VisualStudio2019中创建C++项目,包括添加必要的库文件和配置项目属性,最终实现Proto文件的完整解析和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Proto文件的解析

1.1 下载Google项目

a. Protobuf-cpp-3.9.1.zip

网址:https://github.com/protocolbuffers/protobuf/releases
在这里插入图片描述
b. Cmake-3.15.2-win32-x86.msi

网址:https://cmake.org/download/
在这里插入图片描述
1.2 安装以及编译完成

默认前提:已完成Visual Studio 20xx(本望断为2019)

a. 点击Cmake-3.15.2-win32-x86.msi进行安装

即同意接受协议、默认安装选项和默认安装路径完成软件安装

b. 解压文件Protobuf-cpp-3.9.1.zip

c. 创建一个新文件夹Protubuf_86

d. 打开CMake软件

e. 选择Protobuf-cpp-3.9.1下的cmake文件夹

f. 选择新建的文件夹
在这里插入图片描述
g. 点击“Configure”

配置步骤一:选择Visual Studio 2019

配置步骤二:选择平台Win32(重要)

配置步骤三:Finish

h. 然后点击“Generate”,完成配置

i. 最后点击“Open Project”,打开项目完成Debug\Release编译

1.3 解析生成代码文件

a. 将egm.proto文件放到 protoc.exe同目录下
在这里插入图片描述
b. 打开cmd.exe

c. 输入指令,打开目录如:cd Desktop\protubuf_86\Release

d. 输入指令:protoc -I=./ --cpp_out=./ egm.proto

e. 即生成文件egm.pb.h和egm.pb.cc
在这里插入图片描述

2. 创建C++项目

a. 打开Visual Studio 2019, Create a win32 console application

b. 将libprotobuf.lib、egm.pb.h和egm.pb.cc 添加到项目中

c. 将protobuf-3.9.1\src文件夹复制到项目中

d. 项目属性C/C++的General —— Additional Include Directories 添加 protobuf-3.9.1\src

e. 项目属性C/C++的Code Generation —— Runtime Library 修改为 Multi-threaded(/MT)

f. 程序添加#pragma comment(lib, “libprotobuf.lib”)或同上项目配置(略)

g. 注意Debug 不同点为libprotobufd.lib和(/MTD)

如果你没有.proto文件,但是已经有了序列化后的protobuf消息数据,你可以使用反射机制来解析这个消息。在C++protobuf库中,可以使用反射机制来动态访问protobuf消息的字段和值。 下面是一个示例代码,展示了如何使用反射机制来解析protobuf消息: ```c++ #include <google/protobuf/descriptor.h> #include <google/protobuf/message.h> void parse_protobuf_message(const char* data, int size) { // 创建一个空的Message对象 google::protobuf::Message* message = nullptr; // 使用反射机制从data数据中解析出Message对象 const google::protobuf::Descriptor* descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName("MessageTypeName"); if (descriptor) { const google::protobuf::Message* prototype = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor); if (prototype) { message = prototype->New(); if (message->ParseFromArray(data, size)) { // 解析成功,获取Message中的字段值 const google::protobuf::Reflection* reflection = message->GetReflection(); const google::protobuf::FieldDescriptor* field_descriptor = descriptor->FindFieldByName("FieldName"); if (field_descriptor) { if (field_descriptor->is_repeated()) { int field_size = reflection->FieldSize(*message, field_descriptor); for (int i = 0; i < field_size; i++) { const google::protobuf::Message& field_value = reflection->GetRepeatedMessage(*message, field_descriptor, i); // 处理repeated字段值 } } else { const google::protobuf::Message& field_value = reflection->GetMessage(*message, field_descriptor); // 处理非repeated字段值 } } } else { // 解析失败 } delete message; } } } ``` 需要注意的是,使用反射机制解析protobuf消息的效率可能会比使用.proto文件生成的代码低,因为它需要在运行时进行解析。如果你有.proto文件,最好还是使用protobuf编译器生成的代码来解析消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值