在java中,如何转换包含0的字节中以false初始化的位集

在java中,如何转换包含0的字节中以false初始化的位集,java,byte,bitset,Java,Byte,Bitset,我正在进行一个小型java项目,旨在将一个位集转换为多个位集,然后再将这些位集转换为多个字节数组: 例如,我希望将一个位集分成两部分,并将每个部分转换为int: byte[] bytesToBeConverted = {(byte)0x05, (byte)0x00}; BitSet bitSetToBeConverted = BitSet.valueOf(bytesToBeConverted); BitSet BitSetPart1 =new BitSet(8); 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.ArrayIndexOutOfBoundsException 在这种情况下,toByteArray似乎返回null

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

或者有没有其他我没有提到的方法来执行这种操作


非常感谢你的回答

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

试一试


而是从
toByteArray()的Javadoc中:

更准确地说,如果

byte[] bytes = s.toByteArray(); 
然后

bytes.length == (s.length()+7)/8
length()的Javadoc中:

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

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


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

非常感谢!更一般地说,您更愿意在扩展类中重写toByteArray()方法,还是创建一个静态方法来封装原始位集。toByteArray()?@Kate_Bush重写
toByteArray
方法将破坏其契约。一般来说,如果你不能确保(或有意打破)利斯科夫替换原则,继承并不是答案。提供从
位集
获取所需输出的另一种方法;不要延期或违反合同。(事实上,它应该是最终的……)
bytes.length == (s.length()+7)/8