Varint编码

什么是Varint编码

Varint是一种使用一个或多个字节序列化整数的方法,会把整数编码为变长字节

对于32位整型的4个字节数据经过Varint编码后需要1~5个字节,小的数字使用1个byte,大的数字使用5个bytes。

64位整型数据编码后占用1~10个字节。在实际场景中小数字的使用率远远多于大数字,因此通过Varint编码对于大部分场景都可以起到很好的压缩效果。

编码原理

Varint 中的每个 byte 的最高位 bit 有特殊的含义,如果该位为 1,表示后续的 byte 也是该数字的一部分,如果该位为 0,则结束。

其他的 7 个 bit 都用来表示数字。因此小于 128 的数字都可以用一个 byte 表示。大于 128 的数字,比如 300,会用两个字节来表示:1010 1100 0000 0010

由于负数的高位为1,所以采用这种压缩处理的时候必须负数转成正数。

解码的过程就是将字节依次取出,去掉最高有效位,因为是小端排序所以先解码的字节要放在低位,之后解码出来的二进制位继续放在之前已经解码出来的二进制的高位,最后转换为10进制数完成varint编码的解码过程。

举例

对数字123456进行varint编码,123456用二进制表示为1 11100010 01000000,每次低从向高取7位再加上最高有效位变成1100 0000 - 11000100 - 00000111 所以经过varint编码后123456占用三个字节分别为192 196 7。

每8位的第一位是最高有效位(most significant bit - msb)–msb。

------ 本文结束------

本文标题:Varint编码

文章作者:Perkins

发布时间:2019年11月30日

原始链接:https://perkins4j2.github.io/posts/63107/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。