protobuf可变长编码的实现原理

protobuf中的整数,如int32、int64、uint32、uint64、sint32、sint64、bool和enum,采用可变长编码,即varints。

这样做的好处是,可以节省空间。根据整数大小来决定使用多少字节。 下面通过一个具体例子来阐述它的实现原理: 

 

300的二进制表示是100101100。如果用int32变量来存储,需要4个字节:000000000000000100101100。但显然只需要2个字节即可。

1、每个字节的第一位,叫做msb(most significant bit),用于标识下一个字节是否还属于这个整数(1:属于;0:不属于)。

2、从右到左(从低位到高位),每7位一段(留1位给msb),高位不足用0补齐,得到:0000010 0101100。

3、反转字节序(因为要网络字节序),得到:0101100 0000010。如果只是借鉴思想,用于数据压缩,可以不要这步。

4、填充msb,得到:10101100 00000010。即300在protobuf中的存储,只用了2个字节。

 

参考链接:

https://developers.google.com/protocol-buffers/docs/encoding

https://github.com/google/leveldb/blob/master/util/coding.cc

转载于:https://www.cnblogs.com/yangwenhuan/p/10328960.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值