protobuf底层编码格式一览

本文详细介绍了protobuf的底层编码格式,包括varint编码(用于小整数,节省空间),32-bit/64-bit定长编码(用于固定长度数据),以及length-delimited编码(用于可变长度数据和嵌套消息)。protobuf的编码规则是Tag + (Length +) Value,其中Tag由field_num和wire_type组合而成。文章还提及了ZigZag编码用于优化sint32/sint64类型的负数表示,以及编码实例来辅助理解。
摘要由CSDN通过智能技术生成

protobuf底层编码格式

首先要认识protobuf支持的几种编码方式和它们对应的数据类型:

wire-type meaning used for
0 varint int32, int64, uint32, uint64, sint32, sint64, bool, enum
1 64-bit fixed64, sfixed64, double
2 length-delimited string, bytes, embedded messages, packed repeated fields
5 32-bit fixed32, sfixed32, float

值为3和4的wire-type分别是start group和end group,它们现在已被废弃

protobuf使用的编码方式可以简记为TLV:Tag + (Length +) Value。

Tag的定义是:field_num << 3 | wire_type,这个field_num就是.proto文件中字段的编号。

举个例子,如果你有一个.proto文件如下:

message pod {
	optional int32 a = 1;
	optional string str = 2;
	repeated sint32 vec = 3;
}

那么三个字段编码后的tag如下(二进制格式):

a: 00001 000 // field_num = 1, wire_type = 0
str: 00010 010 // field_num = 2, wire_type = 2
vec: 00010 011 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值