Protobuf 二进制文件学习及解析

0. 简介

protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。

由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

更多详情请看:https://developers.google.com/protocol-buffers/docs/overview

1. 基础语法

1 字段限制

required: 必须赋值的字符
optional: 可有可无的字段,可以使用[default = xxx]配置默认值
repeated: 可重复变长字段,类似数组

2 tag

每个字段都有独一无二的tag
tag 1-15是字节编码,16-2047使用2字节编码,所以1-15给频繁使用的字段

3 类型

在这里插入图片描述

系统默认值:
string默认为空字符串;
bool默认为false;
数值默认为0;
enum默认为第一个元素

4 解析与序列化

每个message都包含如下方法,用于解析和序列化,注意目标是字节形式,非文本。
bool SerializeToString(string* output) const: 将message序列化成二进制保存在output中,注意保存的是二进制,不是文本;仅仅是string作为容器。
bool ParseFromString(const string& data): 从给定的二进制数值中解析成message
bool SerializeToOstream(ostream* output) const: 序列化到ostream中
bool ParseFromIstream(istream* input): 从istream中解析出message

3. 讲解举例

建立.proto文件
syntax = "proto3";//指定版本信息,不指定会报错message Person //message为关键字,作用为定义一种消息类型{    string name = 1;    //姓名    int32 id = 2;       //id    string email = 3;   //邮件}message AddressBook{    repeated Person people = 1;}
字段API

一般我们会经常使用protoc来自动生成:

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto

其中protoc工具地址:protoc

而对于字段修饰符为repeated的字段生成的函数,则稍微有一些不同,如people字段,则编译器会为其产生如下的代码:

int people_size() const;void clear_people();const ::Person& people(int index) const;::Person* mutable_people(int index);::Person* add_people();::google::protobuf::RepeatedPtrField< ::Person >* mutable_people();const ::google::protobuf::RepeatedPtrField< ::Person >& people() const;
测试程序
void set_addressbook(){    AddressBook obj;    Person *p1 = obj.add_people(); //新增加一个Person    p1->set_name("mike");    p1->set_id(1);    p1->set_email("mike@qq.com");    Person *p2 = obj.add_people(); //新增加一个Person    p2->set_name("jiang");    p2->set_id(2);    p2->set_email("jiang@qq.com");    Person *p3 = obj.add_people(); //新增加一个Person    p3->set_name("abc");    p3->set_id(3);    p3->set_email("abc@qq.com");    fstream output("pb.xxx", ios::out | ios::trunc | ios::binary);    bool flag = obj.SerializeToOstream(&output);//序列化    if (!flag)    {        cerr << "Failed to write file." << endl;        return;    }    output.close();//关闭文件}void get_addressbook(){    AddressBook obj;    fstream input("./pb.xxx", ios::in | ios::binary);    obj.ParseFromIstream(&input);  //反序列化    input.close(); //关闭文件    for (int i = 0; i < obj.people_size(); i++)    {        const Person& person = obj.people(i);//取第i个people        cout << "第" << i + 1 << "个信息\n";        cout << "name = " << person.name() << endl;        cout << "id = " << person.id() << endl;        cout << "email = " << person.email() << endl << endl;    }}
运行结果:

在这里插入图片描述

点击https://www.guyuehome.com/36919可查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新人程序员必备在线工具推荐(cron、加解密、JSON、AI)

程序员必备在线工具推荐 俗话说的好,工欲善其事必先利其器,下面我就来给大家分享一下我个人常用的工具。也欢迎大家在评论区分享自己喜欢的工具。✈️ 1 在线cron表达式:cron 在日常开发中,我们难免会遇到一些定时任务的场景&…

「每日跟读」句型公式 第2篇

「每日跟读」句型公式 第2篇 1. I’m thinking about____ 我在考虑____ I’m thinking about my future career (我正在思考我未来的职业) I’m thinking about our marriage (我在考虑我们的婚姻) I’m thinking about taking a vacation (我在考虑度一个假) I’m think…

tcpdump + wireshark 服务器抓包分析

tcpdump wireshark 服务器抓包分析 1.tcpdump安装2.tcpdump使用3.安装wireshark4.使用wireshark 本文用以总结使用tcpdump进行抓包,然后使用wireshark工具打开抓包出来的pacp文件进行分析。通过tcpdump可以实时监控到linux服务器中tcp和http、https等通讯的内容和信…

人工智能上手 Pytorch

人工智能上手 Pytorch 1、人工智能框架历史走向 2015年, caffe,优势配置简单,缺点安装麻烦,且不更新维护 2016年,tensorflow 1.x,定义太严格,很复杂。开发成本高。简单的任务,也很…

[Python学习篇] Python创建项目

新建项目 打开开发工具 PyCharm 选择 New Project 目录结构如下 运行 hello world 选中项目,右键 New -> Python File 进行创建文件 运行项目

MYSQL数据库:告别慢查询,优化性能大揭秘

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 MYSQL数据库:告别慢查询,优化性能大揭秘 文章目录 一、揭秘…

Makefile:调用shell脚本和嵌套调用多项目编译(九)

1、Makefile中调用shell脚本 Makefile中可以通过使用$(shell 指令)的方式调用shell脚本a指令:输出当前文件夹下的所有文件b指令:输出当前路径c指令:如果当前目录下不存在abc文件那么创建一个abc的文件 a$(shell ls ./) b$(shell pwd) filen…

关于简单又挣钱的冷门美团项目,美团圈圈

大家好,最近美团又开始搞事情了。接连推出了好几个网推项目,让一大波人都吃上了肉了。 美团的项目很简单,就是给它们的活动做推广。用户只需要拿到它推广的链接,然后去扫码进群就可以了。只要用户保持8天不退就行了。 下面是体验…

揭开AI编程语言Mojo比Pyhon快6.8万倍的5个秘密!

最近(2024年3月29日),号称比Python快6.8万倍的Mojo编程语言开源啦!6.8万倍?你敢相信这个数字是真的吗?不过,就连Mojo官网都把这个结果贴了出来(见下图),这就很…

线程池小项目【Linux C/C++】(踩坑分享)

目录 前提知识: 一,线程池意义 二,实现流程 阶段一,搭建基本框架 1. 利用linux第三方库,将pthread_creat线程接口封装 2. 实现基本主类ThreadPool基本结构 阶段二,完善多线程安全 1. 日志信息打印…

若依框架时间比较的坑(DATE_FORMAT)

背景 - 想做生日的比较 若依自带的比较 <if test"params.beginTime ! null and params.beginTime ! "><!-- 开始时间检索 -->AND date_format(u.create_time,%y%m%d) > date_format(#{params.beginTime},%y%m%d)</if><if test"params…

AJAX —— 学习(三)

目录 一、jQuery 中的 AJAX &#xff08;一&#xff09;get 方法 1.语法介绍 2.结果实现 &#xff08;二&#xff09;post 方法 1.语法介绍 2.结果实现 &#xff08;三&#xff09;通用型的 AJAX 方法 1.语法介绍 2.结果实现 二、AJAX 工具库 axios &#xff08;…

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言&#xff0c;采用经典遗传算法&#xff08;GA&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. 代码片段参…

【Qt】Ubuntu20.04.6+Qt5.15.2+QtCreator10.0.1无法输入中文

1、前提条件 1)已经安装了fcitx sudo apt install fcitx sudo apt install fcitx-pinyin sudo apt install fcitx-bin fcitx-table-all sudo apt install fcitx-qt52)系统已经配置fcitx 3)将系统下 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx…

计算机考研408有向无环图描述表达式可靠构造方法

目录 前言目标&#xff08;以王道书为例&#xff09;构造方法1. 建树2. 后序遍历1. a2. b3. 4. b5. c6. d7. 8. *9. *10. c 前言 对王道视频中的分层合并思想不是很满意&#xff0c;笔者提出自己的构造方法。 目标&#xff08;以王道书为例&#xff09; 构造方法 笔者通过王…

Doris实践——同程数科实时数仓建设

目录 前言 一、早期架构演进 二、Doris和Clickhouse选型对比 三、新一代统一实时数据仓库 四、基于Doris的一站式数据平台 4.1 一键生成任务脚本提升任务开发效率 4.2 自动调度监控保障任务正常运行 4.3 安全便捷的可视化查询分析 4.4 完备智能的集群监控 五、收益与…

线控悬架系统分析

线控悬架系统分析 附赠自动驾驶学习资料和量产经验&#xff1a;链接 1 线控悬架系统系统发展现状 • 车辆驾乘过程中&#xff0c;操控性和舒适性是两个重要的评价指标&#xff0c;两者很难兼顾&#xff1b; • 线控悬架就是根据路况实际情况自动调节悬架的高度、刚度、阻尼实…

012_control_flow_in_Matlab中的控制流

Matlab中的控制流 虽然&#xff0c;我们说Matlab中的计算是向量化的&#xff0c;但是在某些情况下&#xff0c;作为一个“程序设计语言”&#xff0c;Matlab也提供了一些控制流结构&#xff0c;来帮助我们实现一些复杂的逻辑。 我会在介绍控制流的时候&#xff0c;提醒如何用…

Ansys Zemax | 如何将光栅数据从Lumerical导入至OpticStudio(上)

附件下载 联系工作人员获取附件 本文介绍了一种使用Ansys Zemax OpticStudio和Lumerical RCWA在整个光学系统中精确仿真1D/2D光栅的静态工作流程。将首先简要介绍方法。然后解释有关如何建立系统的详细信息。 本篇内容将分为上下两部分&#xff0c;上部将首先简要介绍方法工…

【Leetcode】top 100 技巧

136 只出现一次的数字 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 技巧&#xff1a…