Protocol buffers 在协议缓冲区消息文件中定义uint8_t变量

Protocol buffers 在协议缓冲区消息文件中定义uint8_t变量,protocol-buffers,Protocol Buffers,我想定义一个点消息,其中表示三维空间中的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变量定义点的位置,r,g,b定义RGB空间中的颜色 由于未在协议缓冲区中定义uint8\t,因此我正在寻找一种解决方法来定义它。目前,我正在使用uint32代替ui

我想定义一个点消息,其中表示三维空间中的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
变量定义点的位置,
r,g,b
定义RGB空间中的颜色


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

protobuf中没有任何表示单个字节的内容-这根本不是wire格式担心的问题。这些选择包括:

  • varint(最多64位输入,根据最高设定位,线路上最多10个字节)
  • 固定32位
  • 固定64位
  • 长度前缀(字符串、子对象、压缩数组)
  • (组令牌;罕见的实现细节)
一个字节不适合任何一个。坦率地说,我会对所有3个字节使用一个
fixed32
,并手动组合/分解3个字节(通过移位等)。这里的优点是,对于3个字节,它只有一个字段头,并且不会通过具有高位来人为拉伸(我不确定合成的RGB值是否适合varint)。如果您想在以后添加其他内容(可能是alpha),您还将有一个备用字节

因此:


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

多谢各位。你能添加代码片段通过移位等方式组合rgb吗?@RaviJoshi我不知道你在用什么语言:)我倾向于使用C#,所以:
obj.rgb=(r16),g=(byte)(obj.rgb>>8),b=(byte)obj.rgb。如果您使用的是C/C++,它应该相当类似。非常感谢。抱歉没有提到语言。我用的是C++。再次感谢您的详细回答。
message Point {
    float x     = 1;
    float y     = 2;
    float z     = 3;
    fixed32 rgb = 4;
}