作者:as1dzx | 来源:互联网 | 2023-05-26 19:41
我需要通过相对较慢(低至1Kb/s)的连接传输一些数据.我已经读过Googles协议缓冲区的编码是有效的.这对于我的大部分数据都是正确的,但不适用于布尔值,特别是如果它是重复的字段.问题是我必须每50毫秒传输一个指定数量(15)的布尔值,除了其他数据.Protobuf将每个布尔值编码为一个字节用于字段ID,一个字节用于布尔值(0x00或0x01),这导致30个字节的数据用于15个布尔值.
所以我现在正在寻找一种更好的编码方法.有人还有这个问题吗?在这种情况下达到有效编码的最佳做法是什么?
我的想法是使用编号数据类型(uint32)并手动编码数据,每个bool一位整数.关于这个想法的任何反馈?
1> Kenton Varda..:
在Protobuf中,最好的办法是使用整数位域.如果您有超过64位,请使用bytes
字段(并手动打包).
请注意,Cap'n Proto会将布尔值(在结构和列表中)打包为单个位,因此值得一看.
但是,如果您受带宽限制,最好开发自己的自定义协议.大多数这些序列化框架为了易于使用而牺牲了一点空间(特别是在处理版本偏斜时),但如果你的情况,那么仅关注尺寸可能更重要.只包含一些位的自定义消息格式应该很容易维护,并且可以根据需要紧密打包.
(披露:我是Cap'n Proto的作者,以及Google的大部分开源Protobuf代码.)