2012-06-26 17 views
2

我在一个小的Java项目的工作目标是一个位集合转换成数位集,以及0字节,然后将这些字节的多个阵列:如何转换虚假初始化一个bitset在Java中

对于例如,我想在两个部分位集合分裂和各部分转换成一个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.ArrayIndexOutOf BoundsException toByteArray在这种情况下似乎返回null。

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

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

非常感谢您的回答!

回答

2

toByteArray()的Javadoc:

更确切地说,如果

byte[] bytes = s.toByteArray(); 

然后

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

,并从length()的Javadoc:

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

由于第二BitSet不包含组位,它返回零长度的阵列,作为的Javadoc明确规定。

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

+0

非常感谢!更一般的情况是,你宁愿重写扩展类中的toByteArray()方法或创建一个静态方法来封装原始BitSet.toByteArray()? –

+1

@Kate_Bush重写'toByteArray'方法会破坏它的合约。一般来说,如果你不能确保(或故意打破)Liskov替代原则,继承不是答案。 – alf

+0

确实。提供另一种方法从'BitSet'获取所需的输出;不要延长或违反合同。 (事实上​​,它应该是最终的......) –

0

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

尝试

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

代替