protobuf编码格式解析

news2024/10/7 4:33:17

示例

假如定义一个如下的protobuf类型

message Person {
    required string user_name       = 1;
    optional int64  favorite_number = 2;
    repeated string interests       = 3;
}

将其赋值为:

user_name :   "Martin"
favorite_number :    1337
interests:"daydreaming", "hacking"

则生成的数据解析如下:
在这里插入图片描述

数据格式

从上图可以看到整个数据的解析过程。从这个过程中可以看出,实际上。protobuf的数据格式是tag+length+value模式(TLV模式)。如下:
在这里插入图片描述
protobuf数据就是这样一个长条形的序列。再继续细分的话,可以看到tag实际上是有2部分组成。

tag= tag<<3 | type

tag的高5位为tag,tag更容易理解的话就是数据的编号,上例中user_name 的tag=1,说明读到tag=1,后面跟的数据就是user_name。 favorite_number 和interests 都是同理,只不过其编号分别是2 和3,这个tag在定义.proto文件时就会固定。解析的话,就是根据这个tag来表明tag后面的数据含义。

继续看下type是干啥。在protobuf中,谷歌定义了几种数据类,type实际上是一个数据类型的集合。

IDNameUsed For
0VARINTint32, int64, uint32, uint64, sint32, sint64, bool, enum
1I64fixed64, sfixed64, double
2LENstring, bytes, embedded messages, packed repeated fields
3SGROUPgroup start (deprecated)
4EGROUPgroup end (deprecated)
5I32fixed32, sfixed32, float

其中3和4已经废弃掉了实际上没有用到。
示例中第一个字节是0x0a,对应的tag=1,type=2。当type=2的时候,tag后面跟的数据就是length。当type为其他值的时候,tag后面的数据就是value。

解析tag=1数据

继续来看tag=1的数据,
0a 06 4d 61 72 74 69 6e
第二个字节就是长度为6字节,表示tag=1的数据有6字节长度。其value=4d 61 72 74 69 6e ,转换成ascII就是Martin。至此tag=1的数据解析完毕。

解析tag=2数据

继续来看tag=2的数据
10 b9 0a
0x10解析出来后tag=2 ,type=0。此时b9就是数据而不是数据长度。一直tag=2是favorite_number 数据,为1337,所以b9 0a 解析出来应该是1337(0x539)。而1337的十六进制表示0x539,可见这个编码并不是实际的16进制数。

对于数字类型的,采用的是Varints编码模式。这种编码模式采用的是小端模式。其每个字节实际上是拆分成了2个部分。
最高bit(bit7)表面下一个字节是否是数据的一部分。
bit7=1,下一个字节数据中还是包含的数据。
bit7=0,数据只有一个字节
bit6-0 是数据。

具体来看b9 0a这两个数据
b9二进制为1 0111001 ,其bit7=1说明下一个字节0a也是也是favorite_number 的一部分
0a二进制为0 0001010 ,其中bit7=0,说明favorite_number 的数据到此结束。
由于采用的是小端模式。所以最终的数据是0001010 0111001,对应的16进制是539,十进制为1337,这样就解析出来了favorite_number 的值。编码的过程就是这个逆过程。

参考:
https://www.jianshu.com/p/73c9ed3a4877
https://protobuf.dev/programming-guides/encoding/
https://gitee.com/ljango/ddia/blob/master/ch4.md#thrift%E4%B8%8Eprotocol-buffers

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

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

相关文章

pyLoad远程代码执行漏洞复现(CVE-2023-0297)

1、产品简介 pyLoad是一个用 Python 编写的免费和开源下载管理器&#xff0c;可用于NAS、下一代路由器、无头家庭服务器以及任何能够连接到互联网并支持 Python 编程语言的设备。 2、漏洞概述 pyLoad 存在代码注入漏洞&#xff0c;未经身份验证的攻击者可以通过滥用 js2py 功能…

c/c++:类型限定符,printf输出格式,putchar,scanf,getchar

c/c&#xff1a;类型限定符&#xff0c;printf输出格式&#xff0c;putchar&#xff0c;scanf&#xff0c;getchar 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知道的周边的会c的同学&am…

结构方程模型(SEM)高阶应用系列

结构方程模型&#xff08;Structural Equation Modeling&#xff09;是分析多变量间因果关系的利器&#xff0c;在众多学科领域具有巨大应用潜力。我们前期推出的《基于R语言结构方程模型》通过结构方程原理介绍、结构方程全局和局域估计、模型构建和调整、潜变量分析、复合变量…

docker-compose安装prometheus告警系统

docker-compose安装Prometheus一、概述一、docker-compose二、配置文件一、概述 本文只有监控与告警的安装、告警发送、发送模版的配置。没有数据展示监控数据UI工具 一、docker-compose 1&#xff09;docker-compose.yaml version: 3.0 services:#1.prometheusprometheus:…

springcloud学习总结

springcloud 构建微服务项目步骤 导入依赖编写配置文件开启这个功能 Enablexxx配置类 于2023年2月24日下午17点38分开始学习于2023年3月17日晚上20点26分学完总结代码地址&#xff1a;https://gitee.com/liang-weihao/StudySpringcloud学习笔记地址&#xff1a;https://www.…

【Linux-MYSQL】数据库的使用

目录 1.数据库介绍 &#x1f308;1.1数据库的分类 &#x1f308;1.2存储引擎 2.数据库的操作 &#x1f308;2.1创建数据库 ​编辑&#x1f47f; 1.查show databases; &#x1f47f;2删除 drop database库名 &#x1f47f;3.创建 create 查看创建数据库的详细信息 &…

朝花夕拾 - 卷王的自白(光头祭天,法力无边》

一、震撼开场 做一个卷王 ta 有什么错&#xff0c;无非就是 ——「秃」了那么一点点&#xff01;&#xff01;&#xff01;咳咳咳&#xff0c;一一回复&#xff1a;自愿的没有想不开没有考到寺庙心态正常……如果非要给这次的行为贯穿一个理由&#xff0c;那就是「下周四就 28 …

Nfinity.io ——Web3.0创新性内容创作和社交一站式平台,引领NFT社交新时代

Nfinity.io 是什么&#xff1f; Nfinity.io 是一个Web3.0时代创新性内容创作和社交一站式平台&#xff0c;旨在彻底改变创作者、平台和粉丝的互动关系。该平台允许用户在同一个平台访问他们在 TikTok、YouTube 和 Twitter 等热门社交平台上喜欢/关注的创作者。此外&#xff0c…

图形系统:简简单单学习WindowManagerService的启动流程

作者&#xff1a;新小梦 在系统启动流程中&#xff0c;Zygote进程通过fork自己来创建SystemServer进程。SystemServer进程的主要职责之一就是创建SystemServiceManger&#xff0c;使自己成为服务的注册中心&#xff0c;并启动三种不同类型的服务&#xff1a;引导服务、核心服务…

mqttx read econnreset异常排查

mqtt 会话 read econnreset 使用mqttx连接mqtt服务器时出现READ ECONNRESET的排查 前段时间公司新增了mqtt服务器&#xff0c;在我们初步测试的时候没有问题&#xff0c;但是随着连接数量增多&#xff0c;后续几天连续间隔出现READ ECONNRESET&#xff0c;导致项目无法正常使…

Unity Batching 批处理

Unity Batching 批处理 了解批处理前先了解下 Draw Call 要了解 Draw Call 需要先了解游戏引擎是如何把物体图像绘制到屏幕上的。 (1)&#xff1a;渲染流水线 渲染流水线的任务为从一个 二维、三维场景开始&#xff0c;最终渲染为一张二维图像&#xff0c;显示在屏幕上。 计算…

使用Unit Scaling进行FP16 和 FP8 训练

Unit Scaling 是一种新的低精度机器学习方法&#xff0c;能够在没有损失缩放的情况下训练 FP16 和 FP8 中的语言模型。 使用FP16和BFLOAT16替代FP32可以将内存、带宽和计算需求的大幅减少&#xff0c;这也是目前越来越大的模型所需要的。 背景介绍 随着支持fp8的硬件的发展&…

webrtc入门系列(三)云服务器coturn环境搭建

《webrtc入门系列&#xff08;一&#xff09;easy_webrtc_server 入门环境搭建》 《webrtc入门系列&#xff08;二&#xff09;easy_webrtc_server 入门example测试》 《webrtc入门系列&#xff08;三&#xff09;云服务器coturn环境搭建》 《webrtc入门系列&#xff08;四&…

测试题目气死人

服了差不多每一题都要错几个案例我真的服了wok&#xff0c;什么鬼东西&#xff01;&#xff01;&#xff01; lx学长的羊圈 Description lx学长是一个养羊大户&#xff0c;有成千上百个羊圈。可是却一次也没来羊圈帮过忙&#xff0c;今天他被叫来羊圈给羊羊们施展成双成对大法…

力扣算法系统刷题题解记录

力扣算法系统刷题题解记录 文章目录力扣算法系统刷题题解记录前言一、数组704二分查找示意图&#xff1a;解题思路代码27.移除元素示意图解题思路代码前言 参考顺序和资料&#xff1a;《代码随想录》 二刷要认真做笔记啦&#xff0c;加油&#xff01; 一、数组 704二分查找 …

2023-04-12 面试中常见的数组题目

数组中的问题其实最常见 通过基础问题&#xff0c;掌握写出正确算法的“秘诀”巧妙使用双索引技术&#xff0c;解决复杂问题对撞指针- 滑动窗口 1 从二分查找法看如何写出正确的程序 本节学习重点&#xff1a;处理边界问题&#xff01; 1.确定边界范围方法&#xff0c;先用区…

13、Qt生成dll-QLibrary方式使用

Qt创建dll&#xff0c;使用QLibrary类方式调用dll 一、创建项目 1、新建项目->其他项目->Empty qmake Project->Choose 2、输入项目名&#xff0c;选择项目位置&#xff0c;下一步 3、选择MinGW&#xff0c;下一步 4、完成 5、.pro中添加TEMPLATE subdirs&#xff…

定时任务之时间轮算法

初识时间轮 我们先来考虑一个简单的情况&#xff0c;目前有三个任务A、B、C&#xff0c;分别需要在3点钟&#xff0c;4点钟和9点钟执行&#xff0c;可以把时间想象成一个钟表。 如上图中所示&#xff0c;我只需要把任务放到它需要被执行的时刻&#xff0c;然后等着时针转到这个…

IP协议(网络层重点协议)

目录 一、IP协议报头格式 二、地址选择 1、IP地址 &#xff08;1&#xff09;格式 &#xff08;2&#xff09;组成 &#xff08;3&#xff09;分类 &#xff08;4&#xff09;子网掩码 三、路由选择 IP协议是网络层的协议&#xff0c;它主要完成两个方面的任务&#xf…

4.16--设计模式之创建型之代理模式(总复习版本)---脚踏实地,一步一个脚印

1.代理对象 定义&#xff1a;代理模式给某一个对象提供一个代理对象&#xff0c;并由代理对象控制对原对象的引用&#xff0c;从而实现对真实对象的操作。 通俗的来讲代理模式就是我们生活中常见的中介。 在代理模式中&#xff0c;代理对象主要起到一个中介的作用&#xff0c;…