Protocol Buffer由Google出品的一款轻量而高效的数据序列化和反序列化的方法,下面的我们来介绍一下Protocol Buffer的内部实现原理。
编码包括数据的编解码和函数方法的还原

| Type | Meaning | Used For |
|---|---|---|
| 0 | Varint | int32, int64, uint32, uint64, sint32, sint64, bool, enum |
| 1 | 64-bit | fixed64, sfixed64, double |
| 2 | Length-delimited | string, bytes, embedded messages, packed repeated fields |
| 3 | Start group | groups (deprecated) |
| 4 | End group | groups (deprecated) |
| 5 | 32-bit | fixed32, sfixed32, float |

message user
{
optional int32 id = 1;
optional string name = 2 ;
}

KEY = VARINT(tag<<3|Type)
Tag在user中当为Id时为1,为name为是2,即message成员的编号。
Type是前一页中的数据类型type.
VARINT是经过zipzag压缩后的数据。
编码原则:
步骤:
//数据编码
int encode
{
return (n <<1) ^ (n >>31);
}
//数据解码
int decode(int n)
{
// return (((unsignedint)n) >>1) ^ -(n & 1);
// return
}
ZIPZAG编码举例

数据以7位为单位进行分隔,当高位还有有效数时在BIT7位补1 ,依次类推.
以0x18f为例 :

message user
{
optional int32 id = 1;
optional string name = 2 ;
}
User:
id 值为: 8
Name 值为: “nihao”
Id:
key= ((id:1)<<3) | (type: 0)
value = 10 (encode(10))
Name:
key = ((id:2)<<3 | (type:2))
value = “nihao” //asiic码
len =5 (decode(5))
