Protocol buffers 协议缓冲区-重复布尔值的最佳实践

Protocol buffers 协议缓冲区-重复布尔值的最佳实践,protocol-buffers,Protocol Buffers,我需要通过一个相对较慢(只有1Kb/s)的连接传输一些数据。我读到谷歌协议缓冲区的编码是有效的。 这对于我的大多数数据都是正确的,但对于布尔值则不然,特别是当它是一个重复的字段时。 问题是,除了其他数据外,我必须每50毫秒传输指定数量(15)的布尔值。Protobuf将每个布尔值编码为字段ID的一个字节和布尔值(0x00或0x01)的一个字节,这将为15个布尔值生成30个字节的数据 所以我现在正在寻找一种更好的编码方法。有人已经有这个问题了吗?对于这种情况,实现有效编码的最佳实践是什么 我的想法

我需要通过一个相对较慢(只有1Kb/s)的连接传输一些数据。我读到谷歌协议缓冲区的编码是有效的。 这对于我的大多数数据都是正确的,但对于布尔值则不然,特别是当它是一个重复的字段时。 问题是,除了其他数据外,我必须每50毫秒传输指定数量(15)的布尔值。Protobuf将每个布尔值编码为字段ID的一个字节和布尔值(0x00或0x01)的一个字节,这将为15个布尔值生成30个字节的数据

所以我现在正在寻找一种更好的编码方法。有人已经有这个问题了吗?对于这种情况,实现有效编码的最佳实践是什么


我的想法是使用一个编号的数据类型(uint32)并手动编码数据,对于整数的每一个bool位。有关于这个想法的反馈吗?

在Protobuf中,最好使用整数位字段。如果超过64位,请使用
字节
字段(并手动打包位)

请注意,它将布尔值(在结构和列表中)打包为单个位,因此可能值得一看

但是,如果带宽非常有限,最好开发自己的自定义协议。大多数序列化框架都会为了易于使用而牺牲一点空间(特别是在处理版本倾斜时),但是如果您的情况是这样的话,那么只关注大小可能更重要。只包含一些位的自定义消息格式应该很容易维护,并且可以根据需要紧密打包


(披露:我是Cap'n Proto的作者,也是谷歌大部分开源Protobuf代码的作者。)

我将在本例中使用uint16。uint16_t rightmas16位(uint32_t i){return(uint16_t)(i>>16)}FWIW我以前使用过协议缓冲区-我同意你的uint32想法;听起来效率更高。重复布尔字段的
[packed=true]
是否减少了字节数?没有,只是尝试了一下。[packed=true]仅适用于“基本数字类型”。(如文件中所述)