小型标量类型和 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_tuint32_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,但需要在其上编写你自己的编解码器。