protobuf笔记
2021/7/27 6:09:08
本文主要是介绍protobuf笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
官网:
https://developers.google.com/protocol-buffers/docs/proto3
https://developers.google.com/protocol-buffers/docs/encoding
编译安装
wget https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.17.3.tar.gz cd protobuf-3.17.3 sh ./autogen.sh ./coufigure –prefix=/usr/local/protobuf-3.17.3 make -j4 sudo make install
标量值类型(Scalar Value Types)
wire type
消息存储格式
protobuf采用TLV格式
- Tag 作为该字段的唯一标识
- Length 代表 Value 数据域的长度
- Value 便是数据本身
只有wire type=2(string等类型)的时候才有length字段
TAG和LENGTH使用Base 128 Varints编码
Varints 用来序列化整型,数字(正数)越小占用的字节数越小,例如1用int表示是4个字节,而用Varints只要1个字节。
Base 128 Varints编码
每个字节都是variant,每个字节最高位是最高有效位(most significant bit (msb))
msb为1表示还设有下一个字节,为0表示最后一个字节
每个字节后7位表示7位二进制补码
least significant group first个人理解就是小端序,低位字节在低地址,高位字节在高地址。
1的varint编码是:0000 0001
150的varint编码是:1010 1100 0000 0010
150的二进制是1001 0110,由于超过了7位,故要用两个字节表示
message Test1 {
optional int32 a = 1;
optional string b = 2;
}
以数字150为例子
则该消息编码后的字节流是08 96 01
格式:TAG+VALUE
TAG由两部分组成:field_number+wire_type
field_number即message里等号后面的数字
wire_type共有六种,如上图,故用3位表示即可
所以int32 a = 1;的tag(protobuf中叫做key)值是08
所以假如Test1中a的值是150则编码后的字节流是08 96 01,TAG+VALUE。
string类型的编码
TAG+LENGTH+VALUE
假如Test1中b的值是”ABCD”
则编码后的字节流:
0A 04 41 42 43 44
int32编码负数字节占用太多
sint32和sint64使用ZIGZAG编码负数
enum和int32一样都是wire type 0
这篇关于protobuf笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-19JAVA分布式id教程:轻松入门与实践
- 2024-11-19Java高并发教程:入门与实践指南
- 2024-11-19JAVA高并发直播教程:新手入门指南
- 2024-11-19Java高并发直播教程:入门与实践指南
- 2024-11-19Java微服务教程:初学者快速入门指南
- 2024-11-19JAVA微服务教程:新手入门的详细指南
- 2024-11-19Java微服务教程:从零开始搭建你的第一个微服务应用
- 2024-11-19Java项目开发教程:初学者必备指南
- 2024-11-19Java项目开发教程:新手快速入门指南
- 2024-11-19Java项目开发教程:零基础入门到实战