ProtoBuf 编码原理

文章探讨了ProtoBuf作为高效数据传输格式的原因,重点介绍了其编码结构,包括Tag的field_number和wire_type,以及Varints编码和ZigZag编码在处理长度和负数时的优化策略。
摘要由CSDN通过智能技术生成

因为涉及到分布式集群之间的通信,所以来学习了下 ProtoBuf,为什么选择 ProtoBuf 呢?主要还是因为相对于 json , xml 来说,ProtoBuf 传输效率更快,故需要了解下它的编码设计。

首先,每一个 message 进行编码,其结果由一个个字段组成,每个字段可划分为 Tag - [Length] - Value,如下图所示:

Tag 由 field_numberwire_type 两个部分组成:

  • field_number: message 定义字段时指定的字段编号
  • wire_type: ProtoBuf 编码类型,根据这个类型选择不同的 Value 编码方案。

 3 bit 的 wire_type 最多可以表达 8 种编码类型,目前 ProtoBuf 已经定义了 6 种,如上图所示,那么 makeTag 的代码就非常简单明了。

static int makeTag(int fieldNumber , int wireType){
    return (fieldNumber << 3) | wireType
}

1. length 可有可无,主要针对于字符串的时候就会加上 length 方便判断 value 长度。

2. Varints 编码,主要是牺牲第一个比特位,来判断数据是否结束。

3. ZigZag 编码,主要是针对于出现负数的时候,负数的补码所占用的字节过多,采用了负数向正数映射的方式。

推荐&参考阅读:

[深入 ProtoBuf - 简介](深入 ProtoBuf - 编码 - 简书)

[深入 ProtoBuf - 编码](深入 ProtoBuf - 编码 - 简书)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值