赞
踩
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
}
}
现在接受到的字符串: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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。