Protobuff数据类型有哪些?要如何使用?

TheDisguiser 2020-06-02 23:26:57 java常见问答 6932

上回我们介绍了protobuf的序列化原理及概念,这回我们就来看看它有哪些数据类型,要如何使用吧。

一、基本数据类型

结构类型表如下:

Protobuf数据类型

二、Varint类型

1. 每个字节第一位表示有无后续字节,有为1,无为0, (双字节,低字节在前,高字节在后.)

2. 剩余7位倒序合并

例:300 的二进制为 10 0101100
第一位:1(有后续) + 0101100
第二位:0(无后续) + 0000010
最终结果: 101011000000010

三、Message 结构

1)、键值型结构(Key-Value)

2)、第一部分为Key值,Varint 结构

3)、Key值的后三位表示规则类型的Type值,其他部分和为类型的数字编号

4)、后面紧跟value,value的值依据规则类型不同而不同

例: required int32 a = 1; 当a值为150时
Key:0000 1000,类型为000,数字编号为0001
Value(Varint类型):1001 0110 0000 0001
值解码: 000 0001 + 001 0110 = 10010110 = 150

四、字符串类型

1)、字符串采用UTF-8编码

2)、在声明类型和编号后紧跟一个Varint类型,表示字符串长度

3)、下面是字符串内容

例:required string b = 2; 其中b的值为 testing
结果(16进制)是 12 07 74 65 73 74 69 6e 67
棕色为字符串内容
暗红色为Varint的类型申明及编号
紫色为Varint的长度申明

五、带有[packed=true]选项的可重复项

可重复项带有[packed=true]后,所有元素打成一个包,使用类似字符串的数据打包形式

例:

message Test4 {
repeated int32 d = 4 [packed=true];
}

执行结果:

22 // tag (编号 4, 类型 2)
06 // 总长度 (6 bytes)
03 // 第一个元素 (varint 3)
8E 02 // 第二个元素 (varint 270)
9E A7 05 // 第三个元素 (varint 86942)

以上就是今天的全部内容了,如果还想了解小伙伴们还想了解更多这样的编程常见问题,就快快来关注我们网站吧。

推荐阅读:

protobuf序列化原理是什么?protobuf是什么?