前言
传统的integer是以32位来表示的,存储在计算机中不管多大的数字都需要4个字节,而一个字节能表示256以内的数字,两个字节能表示65536以内的数字,在固定范围内只用一个或者两个字节表示岂不节省很大的空间。铛铛铛,varint就是根据这种思想来序列化整数的。从统计的角度来说,一般不会所有的消息中的数字都是大数,因此大多数情况下,采用 varint 后,可以用更少的字节数来表示数字信息,从而实现数据的压缩。
简介
简单来说varint是一种数据压缩算法,其核心思想是利用bit位来实现数据的压缩。使用一个或多个字节序列化整数的方法。较小的数字占用较少的字节数。
原理
除了最后一个字节外,varint编码中的每个字节都设置了最高有效位(msb),msb为1则表明后面的字节还是属于当前数据的,如果是0那么这是当前数据的最后一个字节数据。每个字节的低7位用于以7位为一组存储数字的二进制补码表示,最低有效组在前,或者叫最低有效字节在前。
例如,这里是数字128,它是一个字节,因此未设置msb:01111111
这是300的表示方式1010 1100 0000 0010,它就显示稍微复杂些。
您如何确定这是300?首先取出第一个字节1010 1100最高位为1,表明接下来一个字节是一起的,然后取出紧跟着的一个字节0000 0010发现该字节最高位为0,则表明没有后续。因为varint是最低有效组在前,所以去掉第一个字节的最高位,然后去掉第二个字节的最高位放在第一个字节处理后的数值前面形成100101100 ,如下图所示: