彻底掌握Protobuf编码原理与实战

目录


  • 1.类型

  • 2.VARINT

    • 2.1 无符号数

    • 2.2 有符号数

  • 3.定长

    • 3.1 I64类型

    • 3.2 I32类型

  • 4.LEN

  • 5.代码

学习这些有什么用?

- 如果你是后端开发者,掌握这个对工作非常有用

- 如果你是求职者,面试时可以临危不惧

1.类型

最近看到有直接操作wire type相关的api调用,例如:

  • WriteTag

  • WriteVarint32

等等,那么什么是wire type以及protobuf最核心的编码原理是什么?

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

如上表,官方提供了六个wire类型,其中SGROUP与EGROUP废除掉了,我们忽略它,来看看其他4个编码。

74cc7ba33d9609bb0585405a6a52e6bb.png

本篇文章内容与代码已更新与知识星球,感兴趣的加入即可,欢迎一起讨论。

21d3221ce4f8627f8e2fe1ec454ce60a.jpeg

2.VARINT

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

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

相关文章

React+antd实现可编辑单元格,非官网写法,不使用可编辑行和form验证

antd3以上的写法乍一看还挺复杂,自己写了个精简版 没用EditableRowCell的结构,也不使用Context、高阶组件等,不使用form验证 最终效果: class EditableCell extends React.Component {state {editing: false};toggleEdit () &…

系统软件启动过程

实验一:系统软件启动过程 参考 重要文件 调用顺序 1. boot/bootasm.S | bootasm.asm(修改了名字,以便于彩色显示)a. 开启A20 16位地址线 实现 20位地址访问 芯片版本兼容通过写 键盘控制器8042 的 64h端口 与 60h端口。b.…

Selenium自动化测试框架常见异常分析及解决方法

01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …

C++ concept的概念和使用

C concept的概念和使用 concept 这套语法优化了模板编程,替代了原来的SFINAE编程模式,通过给模板类参数加入限制条件,使得代码可读性更强、编译更快、错误提示更容易理解。 SFINAE编程模式 SFINAE 是"Substitution Failure Is Not An…

msql 批量更新生成不同的uuid()

有时需要对表里的批量数据设置主键uuid,要求每条数据的uuid都不一样。 一、方法: UPDATE honghang_1month_list SET idUUID();UPDATE honghang_1month_list SET idREPLACE(id, -, );注意不能直接执行UPDATE honghang_1month_list SET idREPLACE(UUID()…

Amazon Aurora MySQL 和 Amazon RDS for MySQL 集群故障转移和只读实例扩容时间测试

01 测试背景 Amazon Aurora MySQL 是与 MySQL 兼容的关系数据库,专为云而打造,性能和可用性与商用数据库相当,成本只有其 1/10。 Amazon RDS for MySQL 让您能够在云中更轻松设置、操作和扩展 MySQL 部署。借助 Amazon RDS,您可以…

Android 13.0 Launcher3定制之双层改单层(去掉抽屉式二)

1.概述 在13.0的系统产品开发中,对于在Launcher3中的抽屉模式也就是双层模式,在系统原生的Launcher3中就是双层抽屉模式的, 但是在通过抽屉上滑的模式拉出app列表页,但是在一些产品开发中,对于单层模式的Launcher3的产品模式也是常用的功能, 所以需要了解抽屉模式,然后修…

CSS笔记(黑马程序员pink老师前端)CSS初始化

京东首页CSS初始化 <style>/* 清除默认的padding和margin *//* 通配符选择器渲染较慢&#xff0c;一般用标签选择器 */* {margin: 0;padding: 0;/* CSS3盒子模型 */box-sizing:border-box;}/* em和i中的文字不再倾斜 */em,i {font-style: normal}/* 去除列表前的圆点样式…

SpringBoot环境MongoDB分页+去重+获取去重后的原始数据

最近有个比较复杂的MongoDB查询需求&#xff0c; 要求1&#xff1a;获取最近订单表中的请求参数信息&#xff0c;并需要按照请求参数中的账号进行去重 要求2&#xff1a;数据量可能比较大&#xff0c;因此需要做分页查询 研究了大半天&#xff0c;终于搞出了解决方案&#xff0…

ubuntu系统安装hadoop

Hadoop 分布式计算平台&#xff0c;核心是分布式文件系统HDFS ubantu下 安装jdk wget https://repo.huaweicloud.com/openjdk/18.0.1.1/openjdk-18.0.1.1_linux-aarch64_bin.tar.gz tar -zxvf openjdk-18.0.1.1_linux-aarch64_bin.tar.gz mv jdk-18.0.1.1/ /usr/java18 ech…

【Spring Bean的生命周期实现方式】

文章目录 Spring Bean的生命周期实现方式实例化属性赋值初始化销毁Spring Bean的生命周期实现方式 Spring Bean的生命周期决定了一个Bean的整个生命周期,它分为四个阶段:实例化、属性赋值、初始化和销毁。 实例化 实例化通过构造器实例化和工厂方法实例化两种方式实现;构…

python项目打包上传PyPI

PyPI PyPI&#xff08;Python Package Index&#xff09;是Python编程语言中最大的第三方软件包仓库&#xff0c;它是Python生态系统的核心组成部分。PyPI提供了一个集中存储和分发Python软件包的平台&#xff0c;为开发者和用户提供了便利的方式来查找、安装和分享各种Python…

MySQL触发器详解保证入土

文章目录 简介一、MySQL触发器基础触发器分类基础常用关键字1. 定义触发器2. 创建和删除触发器3. 执行时机和条件 二、MySQL触发器的使用场景1. 数据完整性约束插入触发器更新触发器删除触发器 2. 数据变更日志的记录与追踪3. 触发器与存储过程的对比与选择 三、触发器的性能和…

C++学习笔记(重载、类)

C 1、函数重载2、类2.1、类的方法和属性2.2、类的方法的定义2.3、构造器和析构器2.4、基类与子类2.5、类的public、protected、private继承2.6、类的方法的重载2.7、子类方法的覆盖2.8、继承中的构造函数和析构函数 1、函数重载 函数重载大概可以理解为&#xff0c;定义两个名…

【2023年数学建模国赛】C题解题思路

第一问 要求分析分析蔬菜各品类及单品销售量的分布规律及相互关系。该问题可以拆分成三个角度进行剖析。 1&#xff09;各种类蔬菜的销售量分布、蔬菜种类与销售量之间的关系&#xff1b;2&#xff09;各种类蔬菜的销售量的月份分布、各种类蔬菜销售量与月份之间的相关关系&a…

Curator实现Zookeeper分布式锁

Curator实现Zookeeper分布式锁 1、介绍 Curator是netflix公司开源的一套zookeeper客户端&#xff0c;目前是Apache的顶级项目。与Zookeeper提供的原生客户端相比&#xff0c;Curator的抽象层次更高&#xff0c;简化了Zookeeper客户端的开发量。Curator解决了很多zookeeper客户…

C语言实现三字棋

实现以下&#xff1a; 1游戏不退出&#xff0c;继续玩下一把&#xff08;循环&#xff09; 2应用多文件的形式完成 test.c. --测试游戏 game.c -游戏函数的实现 game.h -游戏函数的声明 (2)游戏再走的过程中要进行数据的存储&#xff0c;可以使用3*3的二维数组 char bor…

idea VCS配置多个远程仓库

Idea VCS配置多个远程仓库 首先要有两个或多个不同远程仓库地址 idea 添加数据源 查看推送记录 添加数据源 ok之后填写账号密码 推送本地项目 选择不同远程地址 push 查看不同远程地址的 不同分支的 推送记录 不期而遇的温柔&#xff1a; 应用开源架构进行项目开发&#xff0…

Java版企业电子招标采购系统源码—企业战略布局下的采购寻源

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

Qt串口基本设置与协议收发

前言 1.一直都想要做一个Qt上位机&#xff0c;趁着这个周末有时间&#xff0c;动手写一下 2.comboBox没有点击的信号&#xff0c;所以做了一个触发的功能 3.Qt的数据类型很奇怪&#xff0c;转来转去的我也搞得很迷糊 4.给自己挖个坑&#xff0c;下一期做一个查看波形的上位…