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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM