ProtoBuf原理

news2025/1/10 16:42:49

一、文章

https://zhuanlan.zhihu.com/p/404782892

二、测试

1.test.proto

syntax = "proto3";

package proto;
option go_package = "./;proto";

message Msg{
    uint32 age1 = 1;
    sint32 age2 = 2;
    string name = 3;
    bytes data = 4;
}

2.main.go

package main

import (
	"fmt"
	pb "test/proto"

	"google.golang.org/protobuf/proto"
)

func main() {

	{
		m := pb.Msg{Age1: 5, Age2: -5, Name: "aaa", Data: []byte("111我")}

		d, err := proto.Marshal(&m)
		if err != nil {
			return
		}
		fmt.Println(fmt.Sprintf("%08b", d))
	}

	fmt.Printf("%08b\n", []byte("我"))
}

3.结果:

 4.分析:

由于protobuf编码后由 key-value组成

则:

age1为  00001000 00000101

其中:

00001000 = 1 << 3 | 0,

00000101 就是5的varint编码;

age2为  00010000 00001001

其中:

00010000 = 2 << 3 | 0

00001001 是-5经过zigzag编码->varint编码的结果

name为 00011010 00000010 01100001 01100001

其中:

00011010 = 3 << 3 | 2

00000010代表长度2

01100001就是字符a的AISCII编码97

data为 00100010 00000101 00110001 00110001 11100110 10001000 10010001

其中:

00100010 = 4 << 3 | 2

00000101代表长度5

01100001就是字符a的AISCII编码97

11100110 10001000 10010001 就是‘我’。

由fmt.Printf("%08b\n", []byte("我"))可以得到‘我’的二进制编码。

得出一下结论:

1.protobuf不会对string,bytes进行压缩,按照内存中的格式进行传输。

2.protobuf会对数字进行压缩传输,注意使用负数时,应使用sint32、sint64。

3.protobuf不像json,xml一样传输字段,而是传输字段在结构中的序号。

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

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

相关文章

【滤波】多元卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第6章节06-Multivariate-Kalman-Filters&#xff08;多元卡尔曼滤波器&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 我们现在准备研究和实现完整的、多…

财报解读:Q2业绩指引未达预期,狂奔的爱彼迎要减速了?

全球民宿龙头爱彼迎Airbnb迎来了一个强劲的开端。 美东时间5月9日盘后&#xff0c;爱彼迎发布了2023年第一季度财报。财报显示&#xff0c;爱彼迎一季度营收、净利润、总预订金额都获得了不同程度增长&#xff0c;超出市场预期。美中不足的是&#xff0c;公司预计二季度营收下…

分组卷积和深度可分离卷积

文章目录 一、常规卷积操作二、分组卷积三、深度可分离卷积 一、常规卷积操作 在图中&#xff0c;输入的特征图大小为 H * W * 4 卷积核个数为 2 个&#xff0c;每个卷积核的大小为 K * K * 4 输出的特征图大小为 H’ * W’ * 2 二、分组卷积 &#xff01;&#xff01;&#…

Java 内存模型

JVM 内部使用的 Java 内存模型&#xff0c; 在逻辑上将内存划分为 线程栈&#xff08;thread stacks&#xff09;和堆内存 &#xff08;heap&#xff09;两个部分。 如下图所示&#xff1a; JVM 中&#xff0c;每个正在运行的线程&#xff0c;都有自己的线程栈。 线程栈包含了当…

多表查询~

文章目录 多表查询内连接外连接子查询单行单列多行单列多行多列 多表查询 笛卡尔积:有A,B两个集合 取A,B所有的组合情况 内连接 要想查询某一章表的某个字段&#xff0c;可用 表名.字段名表示 也可以给表起别名 隐式内连接INNER可省略 外连接 外连接分左外连接和右外连接 子查…

堆排序创建

堆排序创建 一、介绍1、什么是堆2、大项堆&#xff08;排序前&#xff09;3、小项堆&#xff08;排序前&#xff09;4、排序思想 二、大项堆排序案例1、流程2、讲解 三、总结 一、介绍 1、什么是堆 堆是一种叫做完全二叉树的数据结构&#xff0c;可以分为大项堆&#xff0c;小…

计算机知识 小tips

目录 什么是R语言&#xff1f; 电脑长期不关机会产生什么影响&#xff1f; nlp是什么&#xff1f; cv是什么&#xff1f; 什么是R语言&#xff1f; R语言是一种用于数据分析和统计建模的编程语言和环境。它由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman于1995年开发而…

【C语言督学训练营 第十三天】栈与循环队列的顺序实现与链式实现

文章目录 前言栈--思想栈--代码实战队列--思想队列--代码实战真题实战&#xff01; 前言 栈与队列是数据结构中最常见的数据结构之一&#xff0c;因其特性往往可以将问题简单化&#xff0c;在使用栈与队列时要牢记&#xff1a;栈&#xff1a;先进后出&#xff0c;队列&#xf…

逆向练习及相关总结

文章目录 crakeme练习crackme1crackme2crackme3 解题步骤总结关键代码查找方法常见代码C类对象逆向分析C虚函数逆向分析 crakeme练习 crackme1 学到的知识点&#xff1a; main函数查找方法&#xff1a;运行到EntryPoint -> 第一个call&#xff08;一般在第三行&#xff09…

如何用u盘重装系统win7

​如今的U盘重装win7系统是比较常见的重装win7系统的方法&#xff0c;适用性比较高&#xff0c;操作也十分的简单。有的小伙伴想给自己的电脑重装win7&#xff0c;那么我们用u盘重装系统怎么安装win7?现在小编就来教大家如何用u盘重装系统教程。 工具/原料&#xff1a; 系统…

CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM

前言 ctr预估&#xff08;点击率&#xff0c;click-through rate, CTR&#xff09;&#xff0c;指一个user在某个特定的场景下会点击一个item的概率估计&#xff0c;这里的item可以是广告、商品等&#xff0c;是推荐和广告系统中十分重要的模块。另外&#xff0c;这里的user-i…

《程序员面试金典(第6版)》面试题 16.18. 模式匹配(暴力破解 + 剪枝)

题目描述 你有两个字符串&#xff0c;即pattern和value。 pattern字符串由字母"a"和"b"组成&#xff0c;用于描述字符串中的模式。 例如&#xff0c;字符串"catcatgocatgo"匹配模式"aabab"&#xff08;其中"cat"是"a&q…

Redis基础复习

1 Redis基础概述 Redis 是C语言开发的一个开源高性能键值对的内存数据库&#xff0c;可以用来做数据库、缓存、消息中间件等场景&#xff0c;是一种NoSQL(not-only sql,非关系型数据库)的数据库 1.1 参考网站&#xff1a; 官网 中文文档 1.2 安装 linux安装Redis7 1.3 Re…

全新上线!能源行业大型的S/4升级项目——E.ON(意昂)第五次迁移成功完成

意昂集团是一家德国能源集团的控股公司&#xff0c;总部位于埃森。该公司主要活跃在能源网络、能源服务、可再生能源以及德国核电站的运营和退役领域。 意昂于2019年启动了全公司范围内的S/4联合项目&#xff0c;这是SAP大型S/4项目之一&#xff0c;也是能源行业的大型S/4项目。…

linux下mysql如何修改密码,包括本地密码和远程密码。navicat远程登录

当服务器部署mysql,navicat远程访问&#xff0c;修改密码时需要修改两次 1、修改本地登录密码 mysql > SET PASSWORD PASSWORD(123456); mysql > FLUSH PRIVILEGES;重启mysql服务 service mysql restart上面命令如果报错&#xff0c;则采取以下方法&#xff1a; [ro…

SpringBoot基础篇2(整合第三方技术)

一、SpringBoot整合Junit 直接配置的module&#xff0c;默认就可以测试。 SpringBoot整合第三方技术&#xff1a; 1.pom.xml中引入对应的starter&#xff08;有勾选的勾选&#xff0c;没有勾选的选项手动导入。在这里查 查依赖的网站&#xff09; 2.配置相关信息 二、SpringB…

vue diff算法与虚拟dom知识整理(6) 感受diff算法 (不要神话虚拟dom更不要做完美主义)

我们还是打开之前的案例 然后 将src下的index.js代码修改如下 import {init,classModule,propsModule,styleModule,eventListenersModule,h,} from "snabbdom";//创建patch函数const patch init([classModule,propsModule,styleModule,eventListenersModule]);//创…

tcp 三次握手和四次挥手报文分析

1&#xff0c;tcp 三次握手 报文抓取如下&#xff1a; 三段报文分析&#xff1a; 第一次&#xff1a;26->96报文交互 Seq-num 567391014, ACK_NUM 0; flags SYN 第二次&#xff1a;96->26报文交互 Seq-num 416352681, ACK_NUM Seq-num 1 567391014 1 567391015,…

硬件系统工程师宝典(22)-----电容、电感的特性,你都知道吗?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到做电阻选型时要考虑阻值、功率、精度和封装大小。上下拉电阻除了给引脚一个稳定的电平&#xff0c;可以提高电压准位、增加输出功率以及…

法律 法规

第八章、法律 法规 从所涉及的法律法规角度 1️⃣著作权法 2️⃣计算机软件保护条例 3️⃣商标法 4️⃣专利法 从试题考点分布的角度 1️⃣保护期限 2️⃣知识产权人确定 3️⃣侵权判断 中国公民、法人或者其他组织的作品&#xff0c;不论是否发表&#xff0c;都享有著作…