这篇文章在你已经了解protobuf使用的基础上,更进一步的学习,如果不知道protobuf是什么?请查阅这篇文章【golang-protobuf使用】
可变长度类型
官网说明地址:https://developers.google.com/protocol-buffers/docs/proto3
proto文件的可变长度类型有:int32、int64、uin32、uin64、sint32、sint64
连续位标识
Protobuf用的是连续位标识技术,使用每个字节的第一位来标识是否需要继续向后读。每个字节低7位用于实际的编码。
举例:
本次举例使用uin32类型
十进制:300
二进制(4个字节):00000000 00000000 00000001 1000000
protobuf编码过程
从二进制低字节(右边),开始7位分割 : 1100000 000000
倒序: 0000000 1100000
增加标识符位:10000000 01100000
1表示继续往后读取,0表示停止读取
所以最终编码结果为 10000000 01100000,这样将4字节存储大小转化为2字节存储大小
测试
目标:将10^32bit的二进制进行编码
proto文件格式
syntax = "proto3";
message Block {
repeated uint32 data = 1;
}
测试结果:
总结
由测试结果可得如果高位(左边)字节为0,编码结果大小相应减少
有疑问加站长微信联系(非本文作者)