ProtoBuf 实际应用(java)

本文详细解释了protobuf中Varint编码原理以及不同类型数据(如int、string、message)的存储方式,包括长度编码和字节顺序。还展示了如何使用Java与protobuf进行序列化和反序列化的示例,以及protobuf与JSON之间的转换问题。
摘要由CSDN通过智能技术生成

这里field_number 就是具体的索引,wired_type的值按下表查询。

|

wired_type

|

.proto类型

|

| — | — |

|

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

|

|

5

|

32-bit fixed32, sfixed32, float

|

对于int,bool,enum类型,value就是Varint。

而对于string,bytes,message等等类型,value是长度+原始内容编码。

  • 举例int类型存储(Varint存储原理)

存储一个int32 类型的数字,通常是4个字节。但是Varints最少只需要一个字节就可以了。

Varints规定小于128的数字都可以用一个字节来表示,比如10, 它就会用一个字节 0000 1010 来存储。

对于大于128的数字,则用更多个字节存储。

以150举例:protobuf的存储字节是 1001 0110 0000 0001。

为什么会这样标识呢?首先我们了解一个字节共8位,表示的数字是255,但是Varints只用一个字节表示小于128的数字,换句话说,就是Varints只用了8位中的7位来表示数字,而还有一位被用来干嘛了呢?

Varints在官方规定中表示,每个字节的最高位是有特殊含义,当最高位为1的时候,代表后续的字节也是该数字的一部分,后续为0的时候,则表示结束。

比如过150,二进制表示为 1001 0110。

先取后七位 001 0110, 作为第一个字节的内容。

再取余下的位,补0凑齐7位,就

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值