protobuf的序列化和反序列化的分析

2023-10-26

一, protobuf的optional 数据类型序列化分析

1,optional 的protobuf的文件 格式
syntax = "proto2";

message test_proto
{
	optional int32 			proto1 			= 1;  
	optional int32          proto2 = 2; 
	optional int32          proto3 = 3;
	optional int32          proto4 = 4; 
	optional uint32          proto5 = 5; 
	optional string          proto6 = 6; 
	optional int32          proto7 = 7; 
	optional int32          proto8 = 8; 

}

测试程序

/***********************************************************************************************
 * 	created: 		2020-04-12
 * 		
 * 	author:			chensong
 * 								
 * 	purpose:		acceptor
 * 	我可能会遇到很多的人,听他们讲好2多的故事,我来写成故事或编成歌,用我学来的各种乐器演奏它。
 * 	然后还可能在一个国家遇到一个心仪我的姑娘,她可能会被我帅气的外表捕获,又会被我深邃的内涵吸引,在某个下雨的夜晚,她会全身淋透然后要在我狭小的住处换身上的湿衣服。
 * 	3小时候后她告诉我她其实是这个国家的公主,她愿意向父皇求婚。我不得已告诉她我是穿越而来的男主角,我始终要回到自己的世界。
 * 	然后我的身影慢慢消失,我看到她眼里的泪水,心里却没有任何痛苦,我才知道,原来我的心被丢掉了,我游历全世界的原因,就是要找回自己的本心。
 * 	于是我开始有意寻找各种各样失去心的人,我变成一块砖头,一颗树,一滴水,一朵白云,去听大家为什么会失去自己的本心。
 * 	我发现,刚出生的宝宝,本心还在,慢慢的,他们的本心就会消失,收到了各种黑暗之光的侵蚀。
 * 	从一次争论,到嫉妒和悲愤,还有委屈和痛苦,我看到一只只无形的手,把他们的本心扯碎,蒙蔽,偷走,再也回不到主人都身边。
 * 	我叫他本心猎手。他可能是和宇宙同在的级别 但是我并不害怕,我仔细回忆自己平淡的一生 寻找本心猎手的痕迹。
 * 	沿着自己的回忆,一个个的场景忽闪而过,最后发现,我的本心,在我写代码的时候,会回来。
 * 	安静,淡然,代码就是我的一切,写代码就是我本心回归的最好方式,我还没找到本心猎手,但我相信,顺着这个线索,我一定能顺藤摸瓜,把他揪出来。
 * 	************************************************************************************************/
#include <iostream>
#include "test.pb.h"

static const char HEX[16] = {
			'0', '1', '2', '3',
			'4', '5', '6', '7',
			'8', '9', 'a', 'b',
			'c', 'd', 'e', 'f'
		};
std::string get_hex_str(const void *_buf, int num)
		{
			std::string str;
			str.reserve(num << 1);
			const unsigned char* buf = (const unsigned char*)_buf;

			unsigned char tmp;
			for (int i = 0; i < num; ++i)
			{
				tmp = buf[i];
				str.append(1, HEX[tmp / 16]);
				str.append(1, HEX[tmp % 16]);
			}
			return str;
		}


void test_msg()
{
	test_proto msg;
	msg.set_proto1(1);
	msg.set_proto2(1);
	msg.set_proto3(1);
	msg.set_proto4(1);
	msg.set_proto5(1);
	msg.set_proto6("c");
	msg.set_proto7(1);
	msg.set_proto8(1);

	std::string temp = msg.SerializeAsString();

	printf("[hex=%s]\n", get_hex_str(temp.c_str(), temp.length()).c_str());
	printf("temp = %s, len = %lu\n" , temp.c_str(), temp.length());
}


int main(int argc, char *argv[])
{
	
	test_msg();
	return 0;
}

运行效果图

在这里插入图片描述

2. 分析protobuf序列化后hex码(16进制)

序列化的后的hex码

0801100118012001280132016338014001

解析:

08:标志第一个的数据
01:第一个数据是1
10:第二个数据
01:第二个数据是1
18:第三个数据
01:第三个数据是1
20:第四个数据
01:第四个数据是1
28:第五个数据
01:第五个数据是1
32:第六个数据(这个标志位是增加10标志是string类型的数据)
01:第六个数据的长度1字节
63:第六个数据是’c’
38:第七个数据(int类型的数据标志位是增加6)
01:第七个数据是1
40:第八个数据
01:第八个数据是1

总结:protobuf的序列化对改变数据类型时增加标志位的是不同的

二, protobuf的repeated 数据类型序列化分析

1, repeated 的protobuf的文件 格式
syntax = "proto2";

message test_proto
{
	optional int32 			proto1 			= 1;   
	repeated int32          proto2 			= 2; 
	optional int32 			proto3 			= 3;
	repeated int32          proto4 			= 4; 
}

测试程序

/***********************************************************************************************
 * 	created: 		2020-04-21
 * 		
 * 	author:			chensong
 * 								
 * 	purpose:		optional
 * 	我可能会遇到很多的人,听他们讲好2多的故事,我来写成故事或编成歌,用我学来的各种乐器演奏它。
 * 	然后还可能在一个国家遇到一个心仪我的姑娘,她可能会被我帅气的外表捕获,又会被我深邃的内涵吸引,在某个下雨的夜晚,她会全身淋透然后要在我狭小的住处换身上的湿衣服。
 * 	3小时候后她告诉我她其实是这个国家的公主,她愿意向父皇求婚。我不得已告诉她我是穿越而来的男主角,我始终要回到自己的世界。
 * 	然后我的身影慢慢消失,我看到她眼里的泪水,心里却没有任何痛苦,我才知道,原来我的心被丢掉了,我游历全世界的原因,就是要找回自己的本心。
 * 	于是我开始有意寻找各种各样失去心的人,我变成一块砖头,一颗树,一滴水,一朵白云,去听大家为什么会失去自己的本心。
 * 	我发现,刚出生的宝宝,本心还在,慢慢的,他们的本心就会消失,收到了各种黑暗之光的侵蚀。
 * 	从一次争论,到嫉妒和悲愤,还有委屈和痛苦,我看到一只只无形的手,把他们的本心扯碎,蒙蔽,偷走,再也回不到主人都身边。
 * 	我叫他本心猎手。他可能是和宇宙同在的级别 但是我并不害怕,我仔细回忆自己平淡的一生 寻找本心猎手的痕迹。
 * 	沿着自己的回忆,一个个的场景忽闪而过,最后发现,我的本心,在我写代码的时候,会回来。
 * 	安静,淡然,代码就是我的一切,写代码就是我本心回归的最好方式,我还没找到本心猎手,但我相信,顺着这个线索,我一定能顺藤摸瓜,把他揪出来。
 * 	************************************************************************************************/

#include "test.pb.h"
#include <iostream>

static const char HEX[16] = {
			'0', '1', '2', '3',
			'4', '5', '6', '7',
			'8', '9', 'a', 'b',
			'c', 'd', 'e', 'f'
		};
std::string get_hex_str(const void *_buf, int num)
		{
			std::string str;
			str.reserve(num << 1);
			const unsigned char* buf = (const unsigned char*)_buf;

			unsigned char tmp;
			for (int i = 0; i < num; ++i)
			{
				tmp = buf[i];
				str.append(1, HEX[tmp / 16]);
				str.append(1, HEX[tmp % 16]);
			}
			return str;
		}


void test_msg()
{
	test_proto msg;
	msg.set_proto1(1);
	for (int i = 0; i < 5; ++i)
	{
		msg.add_proto2(i+10);	
	}
	msg.set_proto3(2);
	for (int i = 0; i < 5; ++i)
	{
		msg.add_proto4(i+10);	
	}

	
	std::string temp = msg.SerializeAsString();

	printf("[hex=%s]\n", get_hex_str(temp.c_str(), temp.length()).c_str());
	printf("temp = %s, len = %lu\n" , temp.c_str(), temp.length());
	
	
	
	//	序列化的后的hex码

//     0801 100a 100b 100c 100d 100e 1802 200a200b200c200d200e
//     
//     解析:
//     
//     08:标志第一个的数据
//     01:第一个数据是1
//     10:第二个数据(10 这里的 10 和地下的10相同表示是 repeated类型的数据 下面10出现次数就是repeated类型数据的个数)
//     0a:第二个数据是10
//     10:第三个数据
//     0b:第三个数据是11
//     10:第四个数据
//     0c:第四个数据是12
//     10:第五个数据
//     0d:第五个数据是13
//     10:第六个数据
//     0e:第六个数据的长度1字节
//     18:第七个数据(int类型的数据标志位是增加6 因为 上面的repeated 类型数据出现的5次使用 是 8 +(5 * 2) = 18)
//     01:第七个数据是2
//     20:第八个数据(20 这里的 20 和地下的20相同表示是 repeated类型的数据 下面20出现次数就是repeated类型数据的个数)
//     0a:第八个数据是10 底下类似的
//     ...........
//     
//     总结:protobuf的序列化对repeated数据类型的个数是不改变标志位的计算个数
	
	
}


int main(int argc, char *argv[])
{
	
	test_msg();
	return 0;
}

运行效果图

在这里插入图片描述

2. 分析protobuf序列化后hex码(16进制)

序列化的后的hex码

0801 100a 100b 100c 100d 100e 1802 200a200b200c200d200e

解析:

08:标志第一个的数据
01:第一个数据是1
10:第二个数据(10 这里的 10 和地下的10相同表示是 repeated类型的数据 下面10出现次数就是repeated类型数据的个数)
0a:第二个数据是10
10:第三个数据
0b:第三个数据是11
10:第四个数据
0c:第四个数据是12
10:第五个数据
0d:第五个数据是13
10:第六个数据
0e:第六个数据的长度1字节
18:第七个数据(int类型的数据标志位是增加6 因为 上面的repeated 类型数据出现的5次使用 是 8 +(5 * 2) = 18)
01:第七个数据是2
20:第八个数据(20 这里的 20 和地下的20相同表示是 repeated类型的数据 下面20出现次数就是repeated类型数据的个数)
0a:第八个数据是10 底下类似的

总结:protobuf的序列化对repeated数据类型的个数是不改变标志位的计算个数

protobuf的序列化测试的代码的地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

protobuf的序列化和反序列化的分析 的相关文章

  • Protobuf在Android中的基本使用

    前言 Protobuf xff0c 类似于json和xml xff0c 是一种序列化结构数据机制 xff0c 可以用于数据通讯等场景 xff0c 相对于xml而言更小 xff0c 相对于json而言解析更快 xff0c 支持多语言 一 Pr
  • zeromq 利用protobuf通信

    利用zeromq进行编程时候 xff0c 服务器和客户端的通信 xff0c 利用protobuf时候 之前的项目里面 xff0c 需要对protobuf进行编码解码 其实并不需要如此繁琐 xff0c 直接利用 protobuf里面的 Mes
  • ProtoBuf: ByteString和String转换

    ByteString bs 61 ByteString copyFrom 34 hi 34 getBytes System out println bs toStringUtf8
  • 通讯协议序列化解读(一) Protobuf详解教程

    https www cnblogs com tohxyblog p 8974641 html
  • protobuf repeated数组类型的使用

    http www cppblog com API archive 2014 12 09 209070 aspx protobuf是Google开发的一个序列化框架 xff0c 类似XML xff0c JSON xff0c 基于二进制 xff
  • protobuf详解

    1 protobuf 简介 protobuf protocol buffer 是谷歌内部的混合语言数据标准 通过将结构化的数据进行序列化 串行化 xff0c 用于通讯协议 数据存储等领域和语言无关 平台无关 可扩展的序列化结构数据格式 我们
  • Protobuf报错CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size):

    前言 Protobuf全称Protocol buffers xff0c 是Google研发的一种跨语言 跨平台的序列化结构的数据格式 xff0c 是一个灵活的 高效的用于序列化数据的协议 使用protobuf时 xff0c 既可以采用动态链
  • vs2015的OpenCV3.2.0编译

    我们希望添加第三方功能模块和库或者针对特定cpu和gpu的编译调整优化选项 这样的需求就需要自己去编译opencv了 准备东西 opencv opencv contrib cmake 还有两个文件 因为可能是国内的原因 在configure
  • protobuf的序列化和反序列化的分析

    一 protobuf的optional 数据类型序列化分析 1 optional 的protobuf的文件 格式 syntax proto2 message test proto optional int32 proto1 1 option
  • Protobuf C++ 版入门Demo

    Protobuf C 版入门Demo 前言 有关其编译和安装请查看 Protobuf C 版编译安装和简单使用 之前已经进行了编译安装 并且成功将已知的proto文件转化为cc和h 本文简单探讨如何使用Protobuf进行数据写入和读取 也
  • protobuf版本冲突问题解决

    1 proto caffe pb h 17 2 error error This file was generated by an older version of protoc 如果你装有anaconda 以及tensorflow 或者在
  • 【Unity3D】在Unity中使用Protobuf(proto3)

    有研究表明 一条消息数据 用protobuf序列化后的大小是json的10分之一 xml格式的20分之一 是二进制序列化的10分之一 ProtoBuf的优势还是很明显的 这里简单介绍哈使用 一 下载protobuf https github
  • protobuf生成prototxt文件

    使用protobuf可以分为以下几步 1 proto文件的定义 在这个文件中定义了最终生成的prototxt格式 举个例子如下所示 syntax proto2 package label proto message DetectLabel
  • protoc 同时编译多个.protoc文件

    官方的示例 只是编译一个文件的命令行 protoc proto path IMPORT PATH cpp out DST DIR java out DST DIR python out DST DIR go out DST DIR ruby
  • gRPC的介绍、安装与使用

    1 gRPC是什么 在 gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法 使得您能够更容易地创建分布式应用和服务 与许多 RPC系统类似 gRPC也是基于以下理念 定义一个服务 指定其能够被远程调用的方法
  • protobuf 中复合数据类型的读写

    背景 protobuf 在生成的 C 代码中为 proto 文件中的每个 message 生成了对应的 C 类 并提供了数据成员的读写方法 message 类型读写 message 示例 message Point double lng 1
  • protobuf-IOS简单总结(编译、环境搭建)

    什么是protobuf Protocol Buffers are a way of encoding structured data in an efficient yet extensible format Google uses Pro
  • Protobuf(二)proto3语法格式

    proto文件有两种语法标准 proto2和proto3 我们以proto3为例 其语法格式如下 message
  • Hello! protobuf——编译与安装(c++版)

    目录 前言 一 protobuf是什么 二 protobuf官方路径 三 protobuf编译安装 1 安装前建议 2 cmake使用 1 cmake介绍 2 命令行介绍 3 编译选项介绍 4 cmake安装 3 windows下使用nma
  • Protobuf安装步骤

    今天看Brpc开源代码的时候 看到了里面提到了google开源的protobuf的数据序列化和反序列工具 所以特地下了源码 试着看下一个简单的使用过程 1 protobuf的介绍 google protobuf是一个灵活的 高效的用于序列化

随机推荐

  • cpu的架构

    明天继续搞一下cache 还有后面的 下面是cpu框架图 开始解释cpu 1 控制器 控制器又称为控制单元 Control Unit 简称CU 下面是控制器的组成 1 指令寄存器IR 是用来存放当前正在执行的的一条指令 当一条指令需要被执行
  • 单线程 JavaScript 的异步机制与经典 for 循环面试题

    从一个经典的 for 循环问题开始 for var i 1 i lt 5 i setTimeout function timer console log i i 1000 输出是 每隔1秒 输出一个6 共5次 原理 这样的输出 是由 Jav
  • 逆矩阵的性质

    矩阵的逆矩阵具有许多有用的性质 1 如果MM 1 I 则M 1M I 2 M1M2 1 M2 1M1 1 3 M 1 1 M 4 M 1 1 M 1 0 说明 M 1 表示矩阵M的逆 摘自 lt lt 计算机图形学几何工具算法详解 gt g
  • 测试工作内容(一)---需求分析

    当我们要做一个项目时 不管项目是一个大的软件 还是一个小的功能模块 我们在执行之前都要搞清楚 这个项目是做什么的 将会实现哪些功能需求 在时间点范围内需要我们做什么 做哪些工作 所追溯的就是需求 需求分析都需要做哪些事情 怎样做 包括以下四
  • JAVA注释

    单行注释 单行注释 多行注释 多行注释 文档注释 文档注释 放在类定义 方法 field 内部类之前才有效 此行前面这个星号只是为了好看 只有第一行和最后一行的 和 才有效 文档注释可以被javadoc命令抽取出api文档格式 javado
  • 木马编程-手把手带你进入木马的世界之木马编程

    一 基础知识 1 1 木马病毒 木马 Trojan 这个名字来源于古希腊传说 荷马史诗中木马计的故事 Trojan一词的本意是特洛伊的 即代指特洛伊木马 也就是木马计的故事 木马会想尽一切办法隐藏自己 主要途径有 在任务栏中隐藏自己 这是最
  • 希尔排序

    目录 一 原理 二 示例代码 三 算法分析 希尔排序又称为缩小增量排序 是直接插入排序算法的一种更高效的改进版本 希尔排序是基于插入排序的以下两点性质而提出改进方法的 插入排序在对几乎已经排好序的数据操作时 效率高 即可以达到线性排序的效率
  • WebGL加载跨域纹理的解决方法

    本人一直对WebGL很有兴趣 也试着尝试用osgjs写了个DEMO 很成功的出现了效果 可是当自己用ASP net写了个服务端 想用自己写的服务器提供的数据来用做纹理 可是怎么也不出来 还报错 跟了下代码 发现是用作纹理的Image对象的问
  • 华为 5G、阿里检测病毒算法、腾讯 AI 一分钟诊断,国内抗疫科技大阅兵!

    作者 马超 责编 王晓曼 伍杏玲 出品 CSDN ID CSDNnews 近期以来 国际风云不断变换 而在2020年初疫情肆虐期间 也成为我国科技实力的 大检阅 近期人民网官微致敬我们中国科技企业的排头兵 可以说掌握硬核科技成了全民的共识
  • Metasploit(MSF)基础超级详细版

    MSF基础学习看这一篇就够了 Metasploit 常见名词解释 MSF简介 MSF框架结构 MSF配置数据库 内网主机发现 MSF命令查询 常用命令 数据库管理命令 核心命令 模块命令 进程命令 资源脚本命令 后台数据库命令 后端凭证命令
  • 假如“唐僧团队”裁员,你会先裁掉哪一位

    相信很多人看过水煮三国 大话西游 文中去西天取经的4人被影射成一个团队 其中 唐僧是TeamLeader 性格坚韧 目的明确 讲原则 懦弱没主意 孙悟空是团队中那个创意员工 业绩突出却个性极强 屡屡得罪人 猪八戒就好比那为人圆滑 偏偏干活时
  • 【ESP系列】AT指令案例

    前言 ESP系列芯片具有高性价比的联网功能 广受大家的认可 然而 在开发过程中 有时候我们想要使用ESP系列芯片的联网功能 却又不想为此编写繁杂的联网逻辑 串口交互逻辑等等 此时 我们可以运用AT指令来实现简洁的联网控制 本文将介绍这种基于
  • linux命令之查看jvm内存使用情况

    linux命令之查看jvm内存使用情况 1 使用 ps ef grep java 查询java的进程ID 2 使用jstat命令查看堆内存的使用情况 1 垃圾回收统计 jstat gc 进程ID 参数解释 S0C 第一个幸存区的大小 S1C
  • 【vue-treeselect】数据量大的时候懒加载并且可以搜索,树懒加载+搜索

    这两天快被这个懒加载加搜索搞崩溃了 今天小有收获 后面优化了再更新 主要说一下一棵树如何懒加载和搜索 1 ref不解释了 和本次代码无关 2 normalizer格式化内容不重要 3 load options很关键 4 search cha
  • Qt5 C++源码中使用中文的简单步骤

    本文不讲任何道理 当你在Qt5的C 源文件内使用中文时 你只需按顺序简单照做即可 不止是中文 其实你完全可以在代码中使用日韩法俄语等等各国语言 0 通用 源文件保存为带BOM的UTF 8格式 如果你准备跨平台 保存为带BOM的UTF 8是必
  • 计算机迭代步数英语,迭代计算

    迭代法是数值计算中一类典型方法 应用于方程求根 方程组求解 矩阵求特征值等方面 其基本思想是逐次逼近 先取一个粗糙的近似值 然后用同一个递推公式 反复校正此初值 直至达到预定精度要求为止 1 迭代计算次数指允许公式反复计算的次数 在Exce
  • 毕业设计记录(二):基于VUE框架与ECharts和Axios技术结合的Web移动高校实验室管理系统设计与实现

    目录 点击即跳转 参考文献阅读笔记 空间信息与规划系实验室情况统计表 毕业设计进度 前端设计 登陆界面 未美术优化 参考文献 总 参考文献阅读笔记 2 甄翠明 李克 基于Web的高校计算机实验室预约管理系统的研究与设计 J 现代信息科技 2
  • 【速度↑20%模型尺寸↓36%】极简开源人脸检测算法升级

    经过一年的各种尝试 调试 测试以及无数次失败 我们的开源人脸检测算法再次升级 我们团队专注人脸检测优化十几年 一直持续优化 向着最简单的算法努力 新版本提升 计算量更小 速度提升约20 模型尺寸精简36 85K参数降低至54K 准确率有所提
  • so库的反编译,反汇编

    Linux APP SO的反汇编工具 ida Pro 可以反汇编app和SO库 有函数名 但是不能反编译到code这一级别 下载最强的反编译工具 ida Pro 6 4 Plus rar 还有这个反汇编工具 没用过 转自 http bbs
  • protobuf的序列化和反序列化的分析

    一 protobuf的optional 数据类型序列化分析 1 optional 的protobuf的文件 格式 syntax proto2 message test proto optional int32 proto1 1 option