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