【Linux学习笔记】protobuf 基本数据编码

https://zhuanlan.zhihu.com/p/557457644icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/557457644

[新文导读] 从Base64到Protobuf,详解Protobuf的数据编码原理本篇将从Base64再到Base128编码,带你一起从底层来理解Protobuf的数据编码原理。本文结构总体与 Protobuf 官方文档相似,不少内容也来自官方文档,并在官方文档的基础上添加作者理解的内容,如有出入请以官方文档为准。icon-default.png?t=N7T8https://mp.weixin.qq.com/s/OgPnO2TEGSc2Eb8wxQTs6g?spm_id_from=444.41.rich-text.link.click

目录

安装

Base128 Varints 编码

uint

sint

字符串


安装

1. 下载:

wget https://github.com/protocolbuffers/protobuf/releases/download/v21.5/protobuf-cpp-3.21.5.tar.gz
tar zxvf protobuf-cpp-3.21.5.tar.gz protobuf-3.21.5/

2. 编译

cd protobuf-3.21.5/
./configure
make
sudo make install
sudo ldconfig

3. 生成 xxx.pb.h 和 xxx.pb.cc

protoc -I=input_dir --cpp_out=output_dir  [*.proto |/input_dir/specific.proto]
// -I 原文件.proto的所在的文件夹
// --cpp_out 生存pb.c pb.h 存放的文件夹
// 后面跟着所需的.proto文件

Base128 Varints 编码

Varint 是一种紧凑的表示数字的方法。它使用小端标识(意味着计算时需要调换顺序),用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。其中每个字节的最高位用来表示后面一个字节是否属于当前这个数的组成部分,1 代表是,0表示不是。

uint

对于无符号整数,其编码比较简单,以 1 和 300 为例。

step1: 1 的二进制为 0000 0001
step2: 取 7 位,即 000 0001
step3: 多个byte的话,需要进行翻转(因为varints是用小端表示,低位字节放在前面)
step3: 最高位添加一个表示下一个byte是否属于当前数字的标志位,因为 1 只有1个字节表示,所以表示位为0,即最终varints编码表示位为 0000 0001
step1: 300 的二进制表示为 100101100
step2: 每7位隔开,不足的补0 ->      0000010      0101100
step3: 翻转一下byte顺序    0101100      0000010
step4: 填写标志位  1010 1100   0000 0010       (ac 02)

sint

对于有符号数,因为计算机定义负数的符号位为数字的最高位。如果采用 Varint 表示一个负数,那么一定需要 10 个 byte 长度。

因此定义了 sint32 这种类型,采用 zigzag 编码,先进行zigzag编码,将所有整数映射成无符号整数,然后再采用 varint 编码方式编码,这样,绝对值小的整数,编码后也会有一个较小的 varint 编码值。

Zigzag(n) = (n << 1) ^ (n >> 31), n 为 sint32 时
Zigzag(n) = (n << 1) ^ (n >> 63), n 为 sint64 时

字符串

wire_type 类型为 2 的数据,是一种指定长度的编码方式:key + length + content,key 的编码方式是统一的((field_number << 3) | wire_type),length 采用 varints 编码方式,content 就是由 length 指定长度的 Bytes。

message Test2 {optional string b = 2;
}
# 设置该值为"testing"
# testing 的utf8编码为:74 65 73 74 69 6e 67
# 则 field_num = 2       wire_type = 2    key = 0001 0010 (12)
# length = 07则 设置为testing后的编码为:12 07 74 65 73 74 69 6e 67

message 的二进制版本只是使用字段号(field's number 和 wire_type)作为 key。所以protocol buffer 比 JSON,XML 安全一点的原因,如果没有数据结构描述 .proto 文件,拿到数据以后是无法解释成正常的数据的

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

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

相关文章

软件学院PTA天梯赛初赛选拔赛题解

目录 7-2 生肖确定&#xff08;模拟&#xff09; AC代码&#xff1a; 7-3 韩信点兵&#xff08;模拟&#xff09; AC代码&#xff1a; 7-4 程序员买包子&#xff08;模拟&#xff09; AC代码&#xff1a; 7-5 h0078. 蛇形矩阵变形 AC代码&#xff1a; 7-6 军事体能成绩…

23.11.26日总结

图片与文字顶部对齐&#xff1a; <div class"addDishImgBox"><span class"addDishImgZi">商品图片&#xff1a;</span><img :src"myStorePhoto" class"addDishImg"> </div> .addDishImgBox{display: f…

8.前端--CSS-文本属性【2023.11.26】

CSS Text&#xff08;文本&#xff09;属性可定义文本的外观&#xff0c;比如文本的颜色、对齐文本、修饰文本、文本缩进、行间距等 1.文本颜色 color 属性用于定义文本的颜色。 语法&#xff1a; div { color: red; }属性&#xff1a; 2.文本对齐 text-align 属性用于设置元…

学生党福音!一个能自定义词库的单词软件--单词魔方

大家好 我是Yhen 这一期给大家介绍一款自制的单词软件–单词魔方 文章目录 一.创作缘由二.功能介绍&升级内容三.使用方法四.程序获取 一.创作缘由 为什么会有想法开发这个单词软件呢&#xff1f; 因为平时自己在做阅读&#xff0c;看电影时积累下来了一些单词 当我想要系…

【Linux】Linux项目自动化构建工具 --- make / makefile

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和Linux还有算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 …

Node.js下载安装及配置镜像源

一、进入官网地址下载安装包 https://nodejs.org/dist 选择对应你系统的Node.js版本 这里我选择的是Windows系统、64位 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xff0c;开始安装Node.js (2)直接点【Next】按钮&#xff0c;此处可根据…

jmeter 接口测试快速入门 以飞致云平台为例

飞致云电商API地址系统来自飞致云项目。接口API地址&#xff1a;https://gz.fit2cloud.com/swagger-ui.html 飞致云电商系统接口文档 V1.0&#xff1a;见 有道云笔记 该网站可以做接口测试练习。快速了解如何测试接口&#xff0c;如何做关联 系统基地址&#xff1a;https://g…

树套树 (线段树+splay)

树套树&#xff0c;就是线段树、平衡树、树状数组等数据结构的嵌套。 最简单的是线段树套set&#xff0c;可以解决一些比较简单的问题&#xff0c;而且代码根线段树是一样的只是一些细节不太一样。 本题中用的是线段树套splay&#xff0c;代码较长。 树套树中的splay和单一的…

【数据结构】堆(C语言)

今天我们来学习堆&#xff0c;它也是二叉树的一种&#xff08;我滴神树&#xff01;&#xff09; 目录 堆的介绍&#xff1a;堆的代码实现&#xff1a;堆的结构体创建&#xff1a;堆的初始化&#xff1a;堆的销毁&#xff1a;堆的push&#xff1a;堆的pop&#xff1a;判空 &am…

力扣373场周赛题解

第一题&#xff1a; 这个题是一个简单题&#xff0c;数据范围也特别小&#xff0c;所以直接使用模拟方式暴力解答。 直接进行行移动的过程&#xff0c;然后检查移动后的结果是否与移动前相同。 代码&#xff1a; ​ public class Solution {// 将指定行循环右移k次pri…

6.前端--CSS-基础选择器【2023.11.26】

1.CSS基本选择器 标签选择器&#xff1a; 标签选择器&#xff08;元素选择器&#xff09;是指用 HTML 标签名称作为选择器&#xff0c;按标签名称分类&#xff0c;为页面中某一类标签指定统一的 CSS 样式。标签选择器可以把某一类标签全部选择出来&#xff0c;比如所有的 <…

ns-3安装教程

1️⃣ VMware安装Ubuntu虚拟机 VMware安装Ubuntu 18.04虚拟机 6.桥接模式网络配置往后都不看 VMware16 安装Ubuntu22.04.1 服务器版操作系统教程 这块主要看怎么从清华镜像下载ubuntu 本人安装的是ubuntu22.04.3 2️⃣ 安装ns3 【ns-3】零基础安装教程 安装依赖库时遇到了问题 …

Bun 1.0 正式发布,爆火的前端运行时,速度遥遥领先!

目录 Bun Github 41.6k 另外&#xff0c;Bun.js 原生支持了数百个 Node.js 和 Web API&#xff0c;包括约 90% 的 Node-API 函数(fs、path、Buffer 等)。 一、包子1.0Bun 1.0终于来了。 二、Bun 是一个一体化工具包 为什么包子存在 Bun 的目标很简单&#xff1a;消除缓慢…

现货黄金区间交易的两个要点

在现货黄金市场中&#xff0c;我们常碰到横盘区间行情。有区间&#xff0c;就终究会出现突破&#xff0c;因为金价不可能缺乏方向而一直在区间内运行。那既然要突破&#xff0c;我们又应当如何应对和交易呢&#xff1f;下面我们就来讨论一下。 切忌在突破发生时马上跟随突破方向…

个人成长|信奉长期主义,就要多做可积累有复利的事。

哈喽啊&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近有个哥们儿吐槽&#xff0c;说他们公司人事找他谈话&#xff0c;要给降工资&#xff0c;他不同意。 过了没几天又说&#xff1a; “定了&#xff0c;全员降薪”。 “你同意了&#xff1f;” “不同意&#xff0…

CV计算机视觉每日开源代码Paper with code速览-2023.11.21

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】Multi-entity Video Transformers for Fine-Grained Video Representation Learning 论文地址&…

Qt 串口编程-从入门到实战

1. Qt 串口通信流程解析 1.1 串行通信和并行通信对比 并行通信适合距离较短的通信&#xff0c;且信号容易受干扰&#xff0c;成本高串口通讯-设备&#xff08;蓝牙&#xff0c; wifi&#xff0c; gprs&#xff0c; gps&#xff09; 1.2 Qt 串口通信具体流程 1. 创建 QSerial…

Java基于springboot+vue开发服装商城小程序

演示视频&#xff1a; 小程序 https://www.bilibili.com/video/BV1rM411o7m4/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 管理员 https://www.bilibili.com/video/BV1fc411D7V3/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae…

计算机中vcomp140.dll丢失的解决方法,一键修复vcomp140.dll缺失问题

vcomp140.dll是Visual C 2015 Redistributable的一个组件&#xff0c;它是运行一些基于Visual Studio开发的软件所必需的。当你在运行某些程序时&#xff0c;可能会遇到“找不到vcomp140.dll”的错误提示&#xff0c;这通常是由于系统缺少这个组件导致的。本文将介绍vcomp140.d…