varint 背景
Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。
Varint 中的每个 byte 的最高位 bit 有特殊的含义,如果该位为 1,表示后续的 byte 也是该数字的一部分,如果该位为 0,则结束。其他的 7 个 bit 都用来表示数字。
如下图:(注意到最终计算前将两个 byte 的位置相互交换过一次,这是因为 Google Protocol Buffer 字节序采用 little-endian 的方式)
举例
例如:
1、整数 300 的表示,需要两个字节:
1010 1100 0000 0010
2、整数 1 的表示,仅需一个字节:
0000 0001
占用字节数
采用 Varint,对于小的 int32 类型数字,可以用 1 个 byte 来表示;但是也有不好的一面,对于大数字来说依旧采用 Varint 表示法时,大到会需要 5 个 byte 来表示。
所以用 Varint 表示 int32 数字,占 1~ 5 Byte。如下:
int32 MAX 0111 1111 1111 1111 1111 1111 1111 1111
Varint32 1111 1111 1111 1111 1111 1111