Protocol Buffers - 重复布尔值的最佳实践

Protocol Buffers - Best practice for repeated boolean values

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

所以我现在正在寻找一种更好的编码方式。有人也有这个问题吗?在这种情况下达到高效编码的最佳做法是什么?

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

在 Protobuf 中,最好的办法是使用整数位域。如果超过 64 位,请使用 bytes 字段(并手动打包这些位)。

请注意,Cap'n Proto 会将布尔值(在结构和列表中)打包为单独的位,因此可能值得一看。

但是,如果您的带宽非常有限,最好开发您自己的自定义协议。这些序列化框架中的大多数为了易用性(特别是在处理版本偏差时)牺牲了一点 space,但如果你的情况可能更重要的是只关注大小。只包含一些位的自定义消息格式应该足够容易维护,并且可以根据需要尽可能紧密地打包。

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