小标量类型和谷歌协议缓冲区

时间:2017-02-17 10:36:19

标签: c++ protocol-buffers

谷歌协议缓冲区中没有小标量类型的原因是什么?

https://developers.google.com/protocol-buffers/docs/proto#scalar

更具体地说,对于C ++,我会在gpb中将uint16_t转换为两个bytes吗?我正在考虑将现有的基于消息的协议转换为gpb,这对我来说似乎有点奇怪。

2 个答案:

答案 0 :(得分:1)

Gbp使用可变长度编码,这意味着传输整数的大小取决于整数的值。 只使用几个字节就可以发送小的int 以下是指向gbp encoding

的指南的链接

特别是,如果你只有一个short int的特定情况(并且不是很多,在这种情况下你可能想要使用bytes),你应该简单地转换所有{{1} } uint16_t让varints做的事情。

答案 1 :(得分:1)

Protobuf标量类型编码使用可变数量的字节:

  • 如果< 1字节2 **(8-1)= 128
  • 2个字节,如果< 2 **(16-2)= 16384
  • 如果< 3个字节2 **(24-3)= 2097152
  • 如果< 4个字节2 **(32-4)= 268435456 等

因此,虽然这可能会让您成为精通太空的C编码器,但uint_16t只会将最多 2个字节用于最低1/4的范围。

PB最终是为了向前兼容而设计的,谷歌知道短的固定数据类型总是太短 :-)(Y2K,IPv4,即将到来的2038 Unix时间等)如果你确实,非常非常紧凑,使用bytes作为@SRLKilling推荐,代价是需要在它上面编写自己的编解码器。