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