google Base 128 Varints编码

最近学习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数据格式使用该方式进行数据的序列化实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值