在 Protocol Buffers 消息文件中定义 uint8_t 变量

Define uint8_t variable in Protocol Buffers message file

我想在 Protocol Buffers 中定义一个点消息,它表示 3 维 space 中的 RGB 彩色点。

message Point {
    float x   = 1;
    float y   = 2;
    float z   = 3;
    uint8_t r = 4;
    uint8_t g = 5;
    uint8_t b = 6;
}

这里,x, y, z变量定义了Point的位置,r, g, b定义了RGB中的颜色space。

由于 uint8_t 未在 Protocol Buffers 中定义,我正在寻找一种解决方法来定义它。目前,我正在使用 uint32 代替 uint8_t

protobuf 中没有任何表示单个字节的东西——这根本不是 wire-format 担心的事情。选项是:

  • varint(最多 64 位输入,最多 10 个字节,具体取决于最高设置位)
  • 固定 32 位
  • 固定 64 位
  • length-prefixed(字符串,sub-objects,压缩数组)
  • (组标记;罕见的实现细节)

单个字节不适合其中的任何。坦率地说,我会为所有 3 个字节使用单个 fixed32,并手动使用 combine/decompose 3 个字节(通过移位等)。这里的优点是它只有 one 字段 header 用于 3 个字节,并且不会通过高位被人为拉伸(我不确定 a组合的 RGB 值是 varint 的一个很好的候选者)。如果您想在以后添加其他内容(也许是 alpha 版),您还可以有一个备用字节。

所以:

message Point {
    float x     = 1;
    float y     = 2;
    float z     = 3;
    fixed32 rgb = 4;
}

恕我直言,这是正确的方法。您应该使用能够保存要在系统之间发送的所有值的最接近的数据类型。源和目标系统应该验证数据是否在正确的范围内。对于 uint8_t 这确实是 int32。