Protobuf 3.0 编码
Protobuf 是 G 厂开源的序列化数据的方法,可用来通信或者存储数据。它采用 IDL 描述数据接口,使得不同语言编写的程序可以根据同一接口通信。不同编程语言也可以根据 IDL 的描述来生成对应数据结构,该数据结构用来编解码。为此,G 厂为主流开发语言都提供代码生成器(即 protoc )。 为了更好地了解一些细节,本文将主要描述 Protobuf 3.0 的编码规则。 Protobuf 里面主要采用 Varint 和 Zig-Zag 的方式来对整型数字进行编码。在理解 Protobuf 之前,需要先了解这两种编码方式。 Protobuf 采用是 Little Endian 的方式编码。 1. Varints int64, int32, uint64, uint32 都有固定的二进制位数。 如果将这些数字序列化成二进制流的时候,需要额外空间告知接收方数据的长度。对于采用 int64, uint64 这两种类型的数据而言,如果大部分时间都只是使用较小的数值,那么会极大地浪费传输带宽和存储空间。针对这两个问题,Protobuf 采用 Varints 的编码方式。 Varints 将源数据按照 7 bit 分组,每 7 bit 加 MSB (Most Significant Bit) 标识位来组成一个字节,其中 MSB 标识位用来判断是否存在后序分组。如果出现多组的情况,那么低有效位比特组优先。 64 有效位为 7 bit,不需要额外的字节,所以 MSB 比特位为 0。 64 = 0100 0000 => 0100 0000 16657 有效位为 15 bit,需要分成三组字节,前两组字节为了提示还存在后续字节,所以前两组字节的 MSB 比特位为 1。...