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
2
3
4
public final void writeInt32(final int fieldNumber, final int value) throws IOException {
writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);
writeInt32NoTag(value);
}

WireFormat

1
2
3
static int makeTag(final int fieldNumber, final int wireType) {
return (fieldNumber << TAG_TYPE_BITS) | wireType;
}

字符串

嵌套消息

Optional&Repeated

参考

  1. https://developers.google.com/protocol-buffers/docs/encoding
  2. https://blog.csdn.net/carson_ho/article/details/70568606
  3. https://cloud.tencent.com/developer/article/1847678