protobuf编码格式

protobuf序列化出来的二进制消息特别的紧凑,得益于使用巧妙的编码格式。

1、Varint

Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。Varint 中的每个 byte 的最高位 bit 有特殊的含义,如果该位为 1,表示后续的 byte 也是该数字的一部分,如果该位为 0,则结束。其他的 7 个 bit 都用来表示数字。
因此小于 128 的数字都可以用一个 byte 表示。大于 128 的数字,比如 300,会用两个字节来表示:1010 1100 0000 0010

2、Key_Value

Google Protocol Buffer 字节序采用 little-endian 的方式,消息经过序列化后会成为一个二进制数据流,该流中的数据为一系列的 Key-Value 对,每个字段由字段头(key)和字段体(value)组

Key 的定义如下: (field_number << 3) | wire_type

  • 第一部分是 field_number,表示字段序号
  • 第二部分为 wire_type。表示 Value 的传输类型
    Wire Type
    TypeMeaning Used For
    0Varint int32, int64, uint32, uint64, sint32, sint64, bool, enum
    164-bitfixed64, sfixed64, double
    2Length-delimistring, bytes, embedded messages, packed repeated fields
    3Start groupGroups (deprecated)
    4End groupGroups (deprecated)
    532-bitfixed32, sfixed32, float

     

3、zigzag编码

sint32采用zigzag编码

zigzag编码:采用无符号数来表示有符号数字,正数和负数交错

4、例子

300 时编码如下
08 ac 02                       -- 内存中数据
08: 1 << 3 | 0
ac 02                            -- 转换成二进制
1010 1100 0000 0010
010 1100 0000 0010
1 0010 1100
300

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值