小型标量类型和 google 协议缓冲区
Small scalar types and google protocol buffers
google 协议缓冲区中没有小标量类型的原因是什么?
https://developers.google.com/protocol-buffers/docs/proto#scalar
更具体地说,对于 C++,我是否将一个 uint16_t
作为两个 bytes
在 gpb 中传输?我正在考虑将现有的基于消息的协议转换为 gpb,这对我来说有点奇怪。
Gbp使用variable-length编码,意思是传输整数的大小取决于整数的值。
小整数将仅使用几个字节发送。
这是 link 关于 gbp encoding
的指南
特别是,如果你只有一个 short int 的特定情况(而且数量不多,在这种情况下你可能想使用 bytes
),你应该简单地转换所有 uint16_t
到 uint32_t
并让 varints 做这些事情。
Protobuf 标量类型编码使用可变字节数:
- 1 字节如果 < 2**(8-1) = 128
- 2 字节如果 < 2**(16-2) = 16384
- 3 字节如果 < 2**(24-3) = 2097152
- 4 字节如果 < 2**(32-4) = 268435456
等等
因此,作为 space-savvy C 编码器,这可能会让您丧命,但 uint_16t
将占用 最多 2 个字节,仅用于最低的 1/4范围。
PB 最终是为了向前兼容而设计的,Google 知道短的固定数据类型 总是会太短 :-)(Y2K,IPv4,即将推出2038 Unix 时间等)如果你真的非常追求紧凑性,请按照@SRLKilling 的建议使用 bytes
,但需要在其上编写你自己的编解码器。
google 协议缓冲区中没有小标量类型的原因是什么?
https://developers.google.com/protocol-buffers/docs/proto#scalar
更具体地说,对于 C++,我是否将一个 uint16_t
作为两个 bytes
在 gpb 中传输?我正在考虑将现有的基于消息的协议转换为 gpb,这对我来说有点奇怪。
Gbp使用variable-length编码,意思是传输整数的大小取决于整数的值。
小整数将仅使用几个字节发送。
这是 link 关于 gbp encoding
特别是,如果你只有一个 short int 的特定情况(而且数量不多,在这种情况下你可能想使用 bytes
),你应该简单地转换所有 uint16_t
到 uint32_t
并让 varints 做这些事情。
Protobuf 标量类型编码使用可变字节数:
- 1 字节如果 < 2**(8-1) = 128
- 2 字节如果 < 2**(16-2) = 16384
- 3 字节如果 < 2**(24-3) = 2097152
- 4 字节如果 < 2**(32-4) = 268435456 等等
因此,作为 space-savvy C 编码器,这可能会让您丧命,但 uint_16t
将占用 最多 2 个字节,仅用于最低的 1/4范围。
PB 最终是为了向前兼容而设计的,Google 知道短的固定数据类型 总是会太短 :-)(Y2K,IPv4,即将推出2038 Unix 时间等)如果你真的非常追求紧凑性,请按照@SRLKilling 的建议使用 bytes
,但需要在其上编写你自己的编解码器。