编码
Base 128 Variant
这是一种基于 7 bit(即 128)的变字节长度的编码。
- 小端存储(least significant group first)。
- 最高有效位( most significant bit,MSB):1 表示下一个字节也用来表示该数,0 表示这是该数的最后一个字节。
Message Structure
protocol buffer 消息一个 key-value 对的序列。一条消息的二进制形式仅仅使用 field_number 作为 key ,而 field 的 name 和 声明的 type 能且仅能通过解码端引用该消息的定义(例如 .proto
文件)得到。
- key-value :二进制字节流编码表示为 “key-value-key-value-…” 。
- “field_number - wire_type” 表示法:
二进制消息流中每一个 key 是值为(field_number << 3) | wire_type
的 Variant,也就是说 key 的最后 3 个 bit 存储 wire_type 。
其中,wire_type 如下:
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 |
3 | Start group | groups (deprecated) |
4 | End group | groups (deprecated) |
5 | 32-bit | fixed32, sfixed32, float |
message.h
反射(Reflection)
descriptor.h
参考
[1] protobuf 官网:Protocols Buffers Encoding.
[2] protobuf 官网:proto3 assigning_field_numbers.
[3] 博客 Varint.
[4] 官网 message.h.