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

时间:2015-01-14 10:32:44

标签: protocol-buffers

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

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

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

1 个答案:

答案 0 :(得分:8)

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

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

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

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