一篇看懂VINT编码


VINT编码

VInt 编码为 Varint 编码和 ZigZag 编码的结合,本质思想是字节数动态变化的整数,笼统的说就是较小的正整数值将占用较小的空间,其可将 64 位二进制编码的有符号整型编码用 1 到 10 字节表示。例如,在Cpp中int 类型的数据都由固定的 4 字节表示,这样设计的好处是序列化和反序列化简单,但是如果需要存储大量的整数,特别是数值较小的整数占比较大时,会浪费掉许多存储空间。基于此,我们可以采用VINT编码来存储整型数据,从而实现数据压缩,节约存储空间。下面介绍具体的原理。

VINT编码原理

Varint 编码

Varint 编码为一种将 64 位二进制编码的无符号整型根据其大小用不同长度
字节进行编码的编码方式。
编码的规则如下:标志位(1bit)+数据位(7bit)

10000001//第一位为标志位,后七位为数据位

其中每个字节的低 7 位用来表示数值;最高位(第一位)为标志位,1表示后面还有字节数据,且依然为该数值的部分字节, 0表示该字节为该数值的最后一个字节。

00000001 //最高位为0,表示该字节为最后一个字节
10000001 //最高位为1,表示该字节后面还有数据

因此,数字越小,其编码所占用的字节数越少;数字越大,所占字节数越多。
Varint编码示意图

ZigZag编码

ZigZag 编码主要是用来配合 Varint 编码。ZigZag编码将有符号整数映射到无符号整数。这里我们以long类型(64bit)为例,具体的算法如下

ZigZag(n) = (n<<1)^(n>>63)

结果ZigZag编码后,有符号整数映射到无符号整数,如下,

原始数据 ZigZag编码后
0 0
1 1
-1 2
2 3
-2 4
-2147483648 4294967295

VINT编码过程

  1. 基于 ZigZag编码将数据类型变为无符号型。这里我们以-8为例:
负数-8的二进制为:
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111000
采用ZigZag 编码,变为无符号整数后,其二进制为:
00000000 00000000 00000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希望早日退休的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值