整数的Varint编码
Varint编码
一个简单的消息
假设你有如下的protobuf定义
1 | syntax = "proto3"; |
在应用中,你创建了一个TestMessage实例,将a设置为150。接下来将消息序列化。检查序列化后的消息,你会发现是这么一个字节数组
1 | 0x08 0x96 0x01 |
Base 128 Varints
这是一个varints编码。varints是一种使用1个或多个字节来序列化整数的方式。更小地数字占更少的字节。
varint 中的每个字节,除了最后一个字节,都设置了最高有效位 (msb)——这表明还有更多的字节需要处理。 每个字节的低 7 位用于以 7 位为一组存储数字的二进制补码表示,采用小端字节存储。
举个例子,对于1来说,由于只有1个字节,所以没有设置msb
1 | 0000 0001 |
这是300,有一些复杂
1 | 1010 1100 0000 0010 |
怎么发现这是300的?首先,先把每个字节的msb去掉,变换为
1 | 010 1100 000 0010 |
再进行小端转换,变为
1 | 000 0010 010 1100 |
组合为
1 | 100101100 |
即就是300