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 在日常开发中,我们难免会遇到一些定时任务的场景&…

scala05-函数式编程02

函数式编程-函数对象作为方法的参数 package com.zishi.scala.a02.okk05/*** 将函数对象作为方法的参数来使用,* 函数本身就是对象,* 对象的使用领域:变量,方法参数,返回值类型** 类比Java* public void test(User us…

「每日跟读」句型公式 第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数据库:告别慢查询,优化性能大揭秘 文章目录 一、揭秘…

OAuth 2.0(Open Authorization 2.0)授权框架入门介绍

拓展阅读 OAuth 2.0-01-Overview OAuth2-02-java 整合 OAuth2-03-springboot 整合 oauth2 是什么? OAuth 2.0(Open Authorization 2.0)是一种授权框架,允许第三方应用程序访问用户在另一个服务提供者上托管的资源&#xff0c…

2024.3.9力扣每日一题——找出数组的第 K 大和

2024.3.9 题目来源我的题解 题目来源 力扣每日一题;题序:2386 我的题解 对不起,打扰了,完全不会。还是自己看官方题解吧😄~

2024.(3.30和4.1)力扣刷题记录-二叉树学习记录2

一、学习视频 如何灵活运用递归?【基础算法精讲 10】_哔哩哔哩_bilibili 二、跟练代码 1. 100. 相同的树 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # …

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官网都把这个结果贴了出来(见下图),这就很…

Spring Boot的基础知识和应用

在快速发展的软件开发领域,Spring Boot已经成为了一个广受欢迎的框架,它极大地简化了Spring应用的初始搭建以及开发过程。Spring Boot遵循“约定优于配置”的原则,通过默认配置减少了开发者的配置工作量,使得开发者能够更专注于业…

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

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

如何利用OceanBase v4.2的 Runtime Filter提升查询效率

OceanBase数据库中可使用Hash Join联接算法,这种算法可以依据某些字段对两个表进行等值匹配连接。然而,当涉及连接的表(特别是作为Probe Table的表)数据量较大时,Hash Join的性能会显著下降。针对这一问题,…

[蓝桥杯 2023 省 A]填空问题1

A. 幸运数 小蓝认为如果一个数含有偶数个数位,并且前面一半的数位之和等于后面一半的数位之和,则这个数是他的幸运数字。例如 23142314 是一个幸运数字,因为它有 44 个数位,并且 23142314。现在请你帮他计算从 11 至 10000000010…

若依框架时间比较的坑(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;…

java实现小程序授权登录以及获取手机号

1、引入依赖 <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>4.1.0</version></dependency>2、引入封装好的工具类 import cn.binarywang.wx.miniapp.api.WxMaS…