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

时间:2017-11-21 10:50:18

标签: protocol-buffers

我想在Protocol Buffers中定义一个Point消息,它代表三维空间中的RGB彩色点。

janusgraph_ids

此处,message Point { float x = 1; float y = 2; float z = 3; uint8_t r = 4; uint8_t g = 5; uint8_t b = 6; } 变量定义Point的位置,x, y, z定义RGB空间中的颜色。

由于协议缓冲区中未定义r, g, b,因此我正在寻找一种解决方法来定义它。目前,我使用uint8_t代替uint32

2 个答案:

答案 0 :(得分:3)

protobuf中没有任何代表单个字节的东西 - 它根本不是线格式所担心的事情。选项包括:

  • varint(最多64位输入,最多10个字节在线上,具体取决于最高设置位)
  • 修正了32位
  • 修正了64位
  • 长度前缀(字符串,子对象,打包数组)
  • (群组令牌;罕见的实施细节)

单个字节不适合任何。坦率地说,我将为所有3使用单个fixed32,并手动组合/分解3个字节(通过移位等)。这里的优点是它只有3个字节的一个字段标题,并且不会通过高位来人为地拉伸(我不确定组合的RGB值是一个好的候选者)用于varint)。如果你想在以后添加别的东西(alpha,也许),你也会有一个备用字节。

所以:

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

答案 1 :(得分:1)

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