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