创建具有大量选项的位掩码



在我的Android应用程序中,我有一个只包含数据的类(用getters公开)。此类需要序列化并发送到其他客户端(通过遍历所有 getter 并将它们存储在 ByteBuffer 中来完成)。

public class Data 
{
     public int getOption1() { }

     public int getOption2 { }
     // ...
     public int getOptionN { } 
}

序列 化:

public void serialize(Data data) {
    // write getOption1();
    // write getOption2();
    // ...
}

反序列化:

public void deserialize() {
    // read Option1();
    // read Option2();
    // ...
}
我希望能够定义实际发送哪些字段

(而不是盲目发送所有字段),一个潜在的解决方案是定义另一个字段,该字段是定义实际发送哪些字段的bitmask

接收端解析位掩码,并可以判断应从收到的消息中反序列化哪些字段。

问题是 - 使用 int(32 位)作为位掩码只允许 32 个唯一选项(通过使用 2 个枚举值的"标准"幂)。

如何定义可以支持更多项目的位掩码? 是否有任何其他编码(除了将每个值存储为 2 的幂)?

实际值的数量可能会有所不同(取决于用户输入),并且可以从 ~ 50 到 200 不等。

我想以最有效的编码对不同的选项进行编码。

int

32 个选项中的每一个提供了位。您可以使用long为 64 个选项中的每个选项获取一点。对于更多的选项,可以使用intlong数组。取选项的数量,除以 32(对于 int 数组)或 64(对于long数组)并向四舍五入。

byte阵列将提供最少的浪费。将选项数除以 8 并向四舍五入。您可以保留第一个字节以包含字节数组的长度(如果您还要传递其他数据)。由于Byte.MAX_VALUE是 127(但您可以将该值视为最大有效索引,而不是字节计数),这将您限制为 128 * 8 - 1 = 1023 个选项(如果您愿意做一些额外的工作来处理负字节计数值,则为 2047 个选项)。最大浪费将小于一个字节(加上用于存储计数的额外开销字节)。

如果每个选项都可以独立存在或不存在,那么您就不能做得更好。如果可以对选项进行分组,以便组中的所有选项始终全部存在或全部不存在,则可以进行一些额外的压缩。

最新更新