我有一个位集合,其需要被转换为一个字节[]。然而,通过使用BitSet.toByteArray(),我没有得到正确的输出。我已经尝试了字节[]转化成其二进制形式以便检查比特集和字节]的二进制形式是否similiar。
public static void generate() {
BitSet temp1 = new BitSet(64);
for (int i = 0; i < 64; i++) {
if(i % 8 != 0 && i < 23) {
temp1.set(i, true);
}
}
StringBuilder s = new StringBuilder();
for (int i = 0; i < 64; i++) {
s.append(temp1.get(i) == true ? 1 : 0);
}
System.out.println(s);
byte[] tempByteKey1 = temp1.toByteArray();
for (byte b : tempByteKey1) {
System.out.print(Integer.toBinaryString(b & 255 | 256).substring(1));
}
}
输出:
Bitset: 0111111101111111011111100000000000000000000000000000000000000000
Converted Byte: 1111111011111110011111100000000000000000000000000000000000000000
他们都是64位,但在BitSet中的第一个0是转换后放在别的地方。为什么会出现这种情况,我怎么能解决这个问题?
从BitSet#toByteArray() javadoc:
返回包含在此位设置的所有位的新字节数组。更确切地说,如果..
byte[] bytes = s.toByteArray();
然后
bytes.length == (s.length()+7)/8
和
s.get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)
所有
n < 8 * bytes.length
。返回:含有该位集合中的所有位的小端表示一个字节数组
@since 1.7
注意:toByteArray()
甚至不要求知道size()
,它仅仅是“可靠的”关于length()
!
..所以我建议为执行(替代你的toBinaryString()
)等的方法:
static String toBinaryString(byte[] barr, int size) {
StringBuilder sb = new StringBuilder();
int i = 0;
for (; i < 8 * barr.length; i++) {
sb.append(((barr[i / 8] & (1 << (i % 8))) != 0) ? '1' : '0');
}
for (; i < size; i++) {
sb.append('0');
}
return sb.toString();
}
..to这样称呼它:
System.out.println(toBinaryString(bitSet.toByteArray(), 64);
run:
0111111101111111011111100000000000000000000000000000000000000000
0111111101111111011111100000000000000000000000000000000000000000
BUILD SUCCESSFUL (total time: 0 seconds)