Protocol buffers 在协议缓冲区消息文件中定义uint8_t变量
我想定义一个点消息,其中表示三维空间中的RGB彩色点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
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位
- 长度前缀(字符串、子对象、压缩数组)
- (组令牌;罕见的实现细节)
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;
}