protobuf 中有单字节类型吗?
Posted
技术标签:
【中文标题】protobuf 中有单字节类型吗?【英文标题】:Is there one-byte type in protobuf? 【发布时间】:2013-07-22 05:08:07 【问题描述】:我找不到 proto 中是否可以有 char / byte 类型。
我可以在这里看到各种类型:
https://developers.google.com/protocol-buffers/docs/proto https://developers.google.com/protocol-buffers/docs/encoding但我在那里找不到字节类型,甚至 int16 类型。
【问题讨论】:
非固定整数类型使用可变长度编码,因此您可能会使用int32
处理 16 位和 8 位整数,并让可变长度编码部分注意不发送字节你没有使用。
@muistooshort 恕我直言,您的评论应该被接受。
【参考方案1】:
不,没有固定的 1 字节类型。固定长度只有 4 和 8 字节变体。大多数其他数值被编码为“varint”,它的长度取决于大小(和符号,但“zigzag”在那里发挥作用)。因此,您可以将值 0-127 的字节存储在一个字节中,将 128-255 的字节存储在两个字节中。 16 位值将占用 1 到 3 个字节,具体取决于幅度(和符号 /zigzag 等)。
对于倍数,8 位版本为“字节”,其余为“打包”;这避免了每个值的字段标头成本。
【讨论】:
zigzag 仅适用于 sint 变体。像 int32 这样的普通 int 变体将使用 10 个字节来表示负值。 恕我直言,可能 128~16384 都占用 2 个字节,而不是 128~255? @ch271828n 我明确谈论 bytes 的值为 128-255(即 8 位范围的后半部分),但实际上您最多可以存储 16383 (不是 16384)在 2 个字节的 varint 中 - 即 14 个数据位和 2 个打包位以上是关于protobuf 中有单字节类型吗?的主要内容,如果未能解决你的问题,请参考以下文章