【Kafka系列】变长字段 Varints

909 阅读2分钟

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

  1. 300的二进制形式: 00000001 00101100

  2. 以 7 位为一组: 0000010 0101100

  3. 将两个字节位置翻转,转换为小端字节序: 0101100 0000010

  4. 添加 msb 位,得到 Varints 表示的 300: 10101100 00000010

3. 123456,从 Varints 转换为二进制

  1. 123456 的 Varints 形式 11000000 11000100 00000111

  2. 去掉 msb 位 1000000 1000100 0000111

  3. 翻转字节 0000111 1000100 1000000

  4. 123456 的二进制形式: 00000001 11100010 01000000

参考:

Base 128 Varints

理解字节序

详解varint编码原理