Protocol Buffers编码原理
(TODO)
消息的结构
Wire Type | 编码方式 | 编码长度 | 存储方式 | 被使用的数据类型 |
---|---|---|---|---|
0 | Varint | 变长 | T-V | •int32, int64, uint32, uint64, bool, enum •sint32, sint64(负数时使用) |
1 | 64-bit | 8个字节 | T-V | fixed64, sfixed64, double |
2 | Length-delimited | 变长 | T-L-V | string, bytes, embedded messages, packed repeated fields |
3 | Start group | (弃用) | (弃用) | groups(弃用) |
4 | End group | (弃用) | (弃用) | groups(弃用) |
5 | 32-bit | 4个字节 | T-V | fixed32, sfixed32, float |
Base 128 Varints
Varints使用一或多个字节序列化整数。Varints中的每个字节(除最后一个字节外)都有最高有效位(most significant bit),最高有效位表示后面还有字节,每个字节中的低7位用于存储数值的二进制补码表示,最低有效组在前面
ArrayEncoder
1 | public final void writeInt32(final int fieldNumber, final int value) throws IOException { |
WireFormat
1 | static int makeTag(final int fieldNumber, final int wireType) { |