参考资料:
- 官方文档
-
深入 ProtoBuf - 编码
关于int32和int64兼容,举个🌰
32 位和 64 位的1在Varint的编码下都是0x01,而32位和64位下的-1由于前面的1不能省略,所以编码不同。 -
小而巧的数字压缩算法:zigzag
(n>>1) ^ -(n & 1)里面-指的是取补码
想法
Protocol buffers are Google's language-neutral, platform-neutral,extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler.
protobuf 编码的目的是为了减少传输数据量
1.使用二进制流(TLV)来表示信息
2.对于整数使用 Varint,负整数使用 ZigZag ,进一步减少字节数
代码运行参考
pip 安装
pip install grpcio-tools
使用下列指令编译 .proto 文件,会在当前目录生成 *_pb2.py 和 *_pb2_grpc.py 文件,定义的 message 对象在 *_pb2.py 文件
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. <目标 proto 文件>
示例
example.proto
syntax = "proto2";
package tutorial;
message Example {
repeated int32 id = 1;
repeated int32 pid = 2 [packed=true];
}
example.py
import example_pb2
demo = example_pb2.Example()
demo.id.extend([1,1,1])
demo.pid.extend([1,1,1])
print(demo.SerializeToString())
# 结果
# b'\x08\x01\x08\x01\x08\x01\x12\x03\x01\x01\x01'