Varints 是一种使用一个或多个字节序列化整数的方法。
msb
Varints 中的每个字节都有一个位于最高位的 msb 位(most significant bit),msb 位的取值为 1 和 0:
- 1 表示其后的字节属于当前数据,即还会有更多的数据
- 0 表示当前字节是最后一个字节,即数据的结尾。
一般来说,一个字节 8 位可以表示 256 个值,所以称为 Base 256,而在 Varints 中,除去最高位的 msb 位后,只有 7 位可以存储数据,所以也称这种表示类型为 Base 128。
字节序
字节序,也称字节顺序("Endian"、"endianness" 或"byte-order"),指多字节数据的存储顺序。常见的有两种顺序:
-
大端字节序(Big endian):将高序字节存储在起始地址,是最符合人思维方式的字节序,即地址低位存储值的低位,地址高位存储值的高位。
-
小端字节序(Little endian):将低序字节存储在起始地址,计算机的内部处理都是小端字节序(计算机电路先处理低位字节,效率比较高)。
Varints 中采用的是小端字节序。
示例
1. 1
只占一个字节,msb 位为0:0000 0001
2. 300,从二进制转换为 Varints
-
300的二进制形式:
00000001 00101100 -
以 7 位为一组:
0000010 0101100 -
将两个字节位置翻转,转换为小端字节序:
0101100 0000010 -
添加 msb 位,得到 Varints 表示的 300:
10101100 00000010
3. 123456,从 Varints 转换为二进制
-
123456 的 Varints 形式
11000000 11000100 00000111 -
去掉 msb 位
1000000 1000100 0000111 -
翻转字节
0000111 1000100 1000000 -
123456 的二进制形式:
00000001 11100010 01000000
参考: