上回我们介绍了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)
以上就是今天的全部内容了,如果还想了解小伙伴们还想了解更多这样的编程常见问题,就快快来关注我们网站吧。
推荐阅读: