• 如果第一个比特位为1,表示有关,即连续两个字节都是Key的编码;
  • 如果第一个比特位为0,表示Key的编码只有当前一个字节,后面的字节是Length或者Value;

结合公式 (field_number << 3)| wire_type ,如果域号大于等于16,两个字节共16位,去掉移位的3位,去掉两个字节中第一个比特位,  
总共16个比特位只有16-5==11个比特位用来表示Key,所以Key的域号要小于2^11== 2048。

下面是protobuf的具体使用:

1、创建一个.proto文件,内容如下:

2、使用protoc编译后,生成两个文件:
protoc -I=. –cpp_out=. person.proto

3、写端程序如下:

4、读端程序:

5、首先运行写端程序,把序列化内容写入config文件;再运行读端程序,反序列化文件中的内容,把各个字段的内容打印出来。

6、调试写端程序,看序列化后的内容是怎么样的:

‘n’是id字段的Key,后面的03(八进制)表示id字段的值长度为3;

key的域号不超过15的序列化解析:
因为id字段的域号为1,是小于15的,所以id字段的Key序列化要占1个字节的空间,00000001左移3位变成 00001000,因为string的wire_type值是2,所以00001000再或上2,变成00001010,就是十进制的10,即字符’n’。下面的字段如果域号不超过15,解析同id字段。
后面连续3个’61’(八进制)即字符’1’;
同样2205是name字段的key和value长度,后面是name字段的值;
3204是addr字段的key和value长度;

最后,302>05是test字段的Key和Value长度;

key的域号大于15的序列化解析:
由于CSDN编辑器不支持CSS格式,没有办法标记下面的解析内容的颜色,只有放一个图片上去了 ^_^;
下面图片中的76就是302后面的‘>’字符的八进制表示,302与>共同组成最后一个字段的Key的表示(因为最后一个字段test的域号1000大于15,所以需要占两个字节表示Key)

以上就是我最近对protobuf的了解,也还在学习中。。。