如何在java中包含0的字节中转换用false初始化的bitSet

时间:2012-06-26 14:27:28

标签: java byte bitset

我正在开发一个小型java项目,旨在将BitSet转换为多个BitSet,然后将这些BitSet转换为几个Bytes数组:

例如,我希望将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完全分离的类来克服这个问题?

还是有另一种方法可以执行我未提及的那种操作吗?

非常感谢您的回答!

2 个答案:

答案 0 :(得分:3)

来自toByteArray()的Javadoc:

  

更确切地说,如果

byte[] bytes = s.toByteArray(); 
     

然后

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

来自length()的Javadoc:

  

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

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

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

答案 1 :(得分:0)

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

尝试

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

代替