protocol buffers的编码原理
Posted charlieroro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了protocol buffers的编码原理相关的知识,希望对你有一定的参考价值。
protocol buffers使用二进制传输格式传递消息,因此相比于xml,json来说要轻便很多。
示例:假设定义了一个Message
message Test1 { required int32 a = 1; }
实际使用的时候将a设置为150,然后将其序列化到输出流,查看编码后的message,可以看到如下3个byte
08 96 01
解析:
上述三个字节实际分为两部分: 08 96 01。第一部分(08)包含了message成员变量的field number(a=1)和变量类型(Varint),第二部分(96 01)为a的实际值150。
这里面涉及几个概念:
Varint:这个可以理解为可变长的int类型,数值越小使用的byte越少;
field number和type:protocol buffer消息为一系列的key-value对。二进制版本的消息使用field number作为key
.proto | 说明 | C++ | Java | Python | Go | Ruby | C# | php |
---|---|---|---|---|---|---|---|---|
double | double | double | float | float64 | Float | double | float | |
float | float | float | float | float32 | Float | float | float | |
int32 | 使用变长编码,对负数编码效率低,如果你的变量可能是负数,可以使用sint32 | int32 | int | int | int32 | Fixnum or Bignum (as required) | int | integer |
int64 | 使用变长编码,对负数编码效率低,如果你的变量可能是负数,可以使用sint64 | int64 | long | int/long | int64 | Bignum | long | integer/string |
uint32 | 使用变长编码 | uint32 | int | int/long | uint32 | Fixnum or Bignum (as required) | uint | integer |
uint64 | 使用变长编码 | uint64 | long | int/long | uint64 | Bignum | ulong | integer/string |
sint32 | 使用变长编码,带符号的int类型,对负数编码比int32高效 | int32 | int | int | int32 | Fixnum or Bignum (as required) | int | integer |
sint64 | 使用变长编码,带符号的int类型,对负数编码比int64高效 | int64 | long | int/long | int64 | Bignum | long | integer/string |
fixed32 | 4字节编码, 如果变量经常大于228228 的话,会比uint32高效 | uint32 | int | int | int32 | Fixnum or Bignum (as required) | uint | integer |
fixed64 | 8字节编码, 如果变量经常大于256256 的话,会比uint64高效 | uint64 | long | int/long | uint64 | Bignum | ulong | integer/string |
sfixed32 | 4字节编码 | int32 | int | int | int32 | Fixnum or Bignum (as required) | int | integer |
sfixed64 | 8字节编码 | int64 | long | int/long | int64 | Bignum | long | integer/string |
bool | bool | boolean | bool | bool | TrueClass/FalseClass | bool | boolean | |
string | 必须包含utf-8编码或者7-bit ASCII text | string | String | str/unicode | string | String (UTF-8) | string | string |
bytes | 任意的字节序列 | string | ByteString | str | []byte | String (ASCII-8BIT) | ByteString | string |
参考:Encoding
以上是关于protocol buffers的编码原理的主要内容,如果未能解决你的问题,请参考以下文章