protobuf中的整数,如int32、int64、uint32、uint64、sint32、sint64、bool和enum,采用可变长编码,即varints。
这样做的好处是,可以节省空间。根据整数大小来决定使用多少字节。 下面通过一个具体例子来阐述它的实现原理:
300的二进制表示是100101100。如果用int32变量来存储,需要4个字节:100101100。但显然只需要2个字节即可。
1、每个字节的第一位,叫做msb(most significant bit),用于标识下一个字节是否还属于这个整数(1:属于;0:不属于)。
2、从右到左(从低位到高位),每7位一段(留1位给msb),高位不足用0补齐,得到:10 0101100。
3、反转字节序(因为要网络字节序),得到:0101100 10。如果只是借鉴思想,用于数据压缩,可以不要这步。
4、填充msb,得到:0101100 0000010。即300在protobuf中的存储,只用了2个字节。
参考链接:
https://developers.google.com/protocol-buffers/docs/encoding
https://github.com/google/leveldb/blob/master/util/coding.cc