第四项 Protocol Buffer的使用for C++

一、 Protocol Buffer简介
自行百度。

二、Protocol Buffer好处
  三种语言的编译–>通用性。
  设计的语法规则–>上下兼容性。
  二进制数据传输–>体积小,速度快。

三、Protocol Buffer的使用
  1、可以下载源码,解压编译安装,可以自己百度,网上很多教程。
  2、我自己根据网上教程已编译安装完成,提供C++库与头文件直接使用。
  下载链接:
  方法:A.压缩包解析后,将include文件夹加入到自己开发的工程中。
B.添加#pragma comment(lib, “protobuf.lib”)到代码中,编译工程。

Protocol Buffer的语法
  安装完成之后,开始利用pb开发。
  A.例子:
  第四项 Protocol Buffer的使用for C++
  message:结构体的修饰符 必须带
  Person:结构体自定义名称
optional:限定修饰符 其他修饰符:required\optional\repeated\message
  Required:该字段发送前必须赋值
  Optional:该字段发送前可设可忽略
  Repeated: 该字段是个数组
  Message:该字段是个提前定义的结构体
  String/uint32:数据类型 可以称为wire_type
  Pb数据类型表
第四项 Protocol Buffer的使用for C++
Name/age: 自定义的字段名称
1/2/3:pb结构字段编码值 可以称为:field_number
B.按照例子编写prot文件后,点击同目录下的pbcompile.bat,生成.cc和.h的问题,加入到自己的工程。
C.根据.h头文件提供的接口,可以自己赋值,取值,解析,判断等。
  
  
Protocol Buffer序列化原理
  Varints编码
基本规则是:
(a) 每个Byte的最高位(msb)是标志位,如果该位为1,表示该Byte后面还有其它Byte,如果该位为0,表示该Byte是最后一个Byte。
(b)每个Byte的低7位是用来存数值的位
(c)Varints方法用Litte-Endian(小端)字节序
  ZigZag 编码
sint32和sint64的类型当值为负数的时候,varints编码出来字节比较大。所以先采用Zigzag方法将所有的整数(正数、0和负数)一一映射到所有的无符号数上,然后再采用varints编码方法进行编码。
基本规则是:
Zigzag(n) = (n << 1) ^ (n >> 31), n为sint32时
Zigzag(n) = (n << 1) ^ (n >> 63), n为sint64时
  Protobuf序列化
  protobuf的message是一连串的key/value对,二进制形式的message也是用key/(Length)/value的形式。Length表示value长度。
  
  
  Key:field_number << 3) | wire_type
   表示后三位存储的是传输类型,前5位存储的是序号。
  
第四项 Protocol Buffer的使用for C++
  
  Value:Varints编码+ZigZag 编码
  
  举例:
  第四项 Protocol Buffer的使用for C++
  
  A、赋值name值为testing
Key/length/Value
Key: number = 1 type=2 : 1<<3 | 2 = 0x12
Length:7 0x07
Value::“testing” 74 65 73 74 69 6e 67
最终: 12 07 74 65 73 74 69 6e 67
  
   B、赋值age值为25
Key/Value
Key: number = 2 type=0: 2<<3 | 0 = 0x10
Value::25 ==> 001 1001
==> 1001 1001
   ==> 99
最终: 10 99

  C、18 96 01
18: 1 1000 ==> type = 0 num= 11000>>3 ==>3
96 01 : 1001 0110 0000 0001
==>000 0001 ++ 001 0110
==> 10010110 = 150 ==>value
最终:High 赋值为3后的序列。