当前位置:   article > 正文

protobuf编解码_protobuf编码与解码

protobuf编码与解码
protobuf 的编码规则

protobuf采用了 TLV(tag-length-value) 编码格式对数据进行编码。每个字段都有唯一的 tag 值,它是字段的唯一标识。length 表示 value 数据的长度,length 不是必须的,对于固定长度的 value,是没有 length 的。value 是数据本身的内容。

对于 tag 值,它有 field_number 和 wire_type 两部分组成。field_number 就是在前面的 message 中我们给每个字段的编号,wire_type 表示类型,是固定长度还是变长的。 wire_type 当前有0到5一共6个值,所以用3个 bit 就可以表示这6个值。tag 结构如下图。
在这里插入图片描述

wire_type 值如下表, 其中3和4已经废弃,我们只需要关心剩下的4种。对于 Varint 编码数据,不需要存储字节长度 length。这种情况下,TLV 编码格式退化成 TV 编码。对于64-bit和32-bit也不需要 length,因为type值已经表明了长度是8字节还是4字节。
在这里插入图片描述

手动解码实例

想要解码protobuf 编码的字符串需要先知道定义的数据格式。现有message定义如下:

message TopMessage{
	int messageType
	message  CallStates {
		int type
		int state
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

现在接受到的字符串:08 04 2A 04 08 02 10 01
08 -> 0000 1000 后三位为000即type为0,说明08 04是一个filed,04就是数据值,对应到TopMessage的结构,message type为 04;
2A -> 0010 1010 后三位为010即type为2,说明2A后面的04表示数据长度,即2A 04 08 02 10 01是一个filed,对应到TopMessage的结构就是CallStates整个;
继续解析
08 -> 0000 1000 后三位为000即type为0,说明08 02是一个filed,对应到CallStates中就是type为02;
10 -> 0001 0000 后三位为000即type为0,说明10 01是一个filed,对应到CallStates中就是state为01;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/430254
推荐阅读
相关标签
  

闽ICP备14008679号