这里field_number 就是具体的索引,wired_type的值按下表查询。
|
wired_type
|
.proto类型
|
| — | — |
|
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
|
对于int,bool,enum类型,value就是Varint。
而对于string,bytes,message等等类型,value是长度+原始内容编码。
- 举例int类型存储(Varint存储原理)
存储一个int32 类型的数字,通常是4个字节。但是Varints最少只需要一个字节就可以了。
Varints规定小于128的数字都可以用一个字节来表示,比如10, 它就会用一个字节 0000 1010 来存储。
对于大于128的数字,则用更多个字节存储。
以150举例:protobuf的存储字节是 1001 0110 0000 0001。
为什么会这样标识呢?首先我们了解一个字节共8位,表示的数字是255,但是Varints只用一个字节表示小于128的数字,换句话说,就是Varints只用了8位中的7位来表示数字,而还有一位被用来干嘛了呢?
Varints在官方规定中表示,每个字节的最高位是有特殊含义,当最高位为1的时候,代表后续的字节也是该数字的一部分,后续为0的时候,则表示结束。
比如过150,二进制表示为 1001 0110。
先取后七位 001 0110, 作为第一个字节的内容。
再取余下的位,补0凑齐7位,就