我正在开发一个小型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完全分离的类来克服这个问题?
还是有另一种方法可以执行我未提及的那种操作吗?
非常感谢您的回答!
答案 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]);
代替