最近学习protobuf编解码的时候,有了解到varints这块概念,记录于此
原文介绍地址:
https://developers.google.com/protocol-buffers/docs/encoding#varints
varints是用一个或者多个byte序列化整数的方法,它的优点是整型数据的值越小,编码后所用的字节数越小. varint中的每个byte的bit位都有一个最高有效位,最高有效位用来表示这个byte之后是不是还有byte需要解析,后7位用来表示int值的二进制补码。低位组优先排序。
要理解这段话,还是要从例子开始,例如varint编码单个数字1,其编码如下:
0 0 0 0 0 0 0 1
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
因为只有单个数字1,后续没有byte需要解析,所以bit7值为0
接下来看个复杂一点的,数字300的编码显示,其编码后的表示如下:
1010 1100 0000 0010
来刨析一下,上述编码可以理解为两个byte,其二进制表示如下
1010 1100 //byte0
0000 0010 //byte1
按照varint的编码解释,最高位为1表示后续还有字节需要解析,因此byte0的bit7为1, 后7位为数据位。
字节:byte0
二进制表示:1010 1100
bit位:
1 表示后面还有byte要解析
010 1100 数据有效位
字节:byte1
二进制表示:0000 0010
bit位:
0 byte1是最后一个字节,后续没有要解析的,所以此处位置0
000 0010 数据有效位
按照低位组优先排序的原则,将两个byte的数据有效位拼接得到如下二进制表示。
000 0010 010 1100
该值就是300的二进制表示。
varints是基于数值越小,小数值使用越频繁,压缩效率越高的一种思路,目前来看google的protobuf数据格式使用该方式进行数据的序列化实现。