1

在我的 Android 应用程序中,我有一个只包含数据的类(用 getter 公开)。此类需要序列化并发送给其他客户端(通过迭代所有 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 之间。

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

4

1 回答 1

4

Anint为 32 个选项中的每一个提供了一个位。您可以使用 along来获取 64 个选项中的每一个选项。对于更多的选项,您可以使用intorlong数组。取选项的数量,除以 32(对于int数组)或 64(对于long数组)并向上取整。

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

如果每个选项都可以独立存在或不存在,那么您将无法做得更好。如果可以对选项进行分组,使得组中的所有选项总是全部存在或全部不存在,那么一些额外的压缩可能是可能的。

于 2013-10-30T23:11:03.290 回答