3

我正在开发一个小型 Java 项目,旨在将一个 BitSet 转换为几个 BitSet,然后将它们转换为几个字节数组:

例如,我希望将 BitSet 分成两部分并将每个部分转换为 int :

    byte[] bytesToBeConverted = {(byte)0x05, (byte)0x00};
    BitSet bitSetToBeConverted = BitSet.valueOf(bytesToBeConverted);

BitSet BitSetPart1 =new BitSet(8);
BitSetPart1=bitSetToBeConverted.get(0,8);
int intPart1 = (int)(BitSetPart1.toByteArray()[0]); //intPart1 ==5

BitSet BitSetPart2 =new BitSet(8);
BitSetPart2 = bitSetToBeConverted.get(8,16);
int intPart2 = (int)(BitSetPart2.toByteArray()[0]); //intPart2 == 0 is wanted

虽然在第一部分(将 bitSetPart1 转换为 intPart1)中确实没有出现问题,但在第二部分中,BitSetpart2 必须使用 false 进行初始化,这会导致在访问 toByteArray() 方法的结果时引发异常:java.lang .ArrayIndexOutOfBoundsException toByteArray 在这种情况下似乎返回 null 。

这是否意味着零是该类型操作的禁止值?在这种情况下,您宁愿扩展 BitSet 类并覆盖 toByteArray() 方法吗?或者创建一个与 BitSet 完全分离的类,并使用额外的方法来克服该问题?

还是有另一种方法来执行我没有提到的那种操作?

非常感谢你的回答!

4

2 回答 2

3

来自的Javadoc toByteArray()

更准确地说,如果

byte[] bytes = s.toByteArray(); 

然后

bytes.length == (s.length()+7)/8

并来自Javadoc length()

返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加一。如果 BitSet 不包含设置位,则返回零。

由于第二个BitSet不包含设置位,因此它返回一个长度为零的数组,正如 Javadoc 明确指定的那样。

如果要将toByteArray()out 的结果填充到指定的字节数,请使用Arrays.copyOf(bitSet.toByteArray(), desiredLength).

于 2012-06-26T14:33:30.267 回答
0

空位集返回一个空数组,因此获取[0]确实是非法的。

尝试

BitSetPart2 = bitSetToBeConverted.get(8,16);
byte[] temp = BitSetPart2.toByteArray();
int intPart2 = temp.length == 0 ? 0 : (int)(temp[0]); 

反而

于 2012-06-26T14:32:53.590 回答