将 BitSet 转换为 Byte[]

5

我有一个BitSet,需要将其转换为Byte[]。然而,使用BitSet.toByteArray()时,我没有得到正确的输出。我尝试将Byte[]转换为其二进制形式,以检查Bitset和Byte[]的二进制形式是否相似。

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放置在其他位置。为什么会发生这种情况,我该如何解决?

1
由于您正在打印BitSet,因此toBinaryString将按相反的位顺序进行打印。 您从最不重要的位开始,而toBinaryString从最重要的位开始。(请参见第一个输出中零在第一位置,而在第二个输出中在第8个位置) - user85421
但它们的低位都有六个真值,高位都有七个真值。 - user8231110
1
你要计算什么???BitSet: 01111111 01111111 01111110 0...; toBinaryString: 11111110 11111110 01111110 0... => 每个对应的8位都被反转了。或者,使用字符表示位,BitSet: hgfedcba ponmlkji ..., toBinaryString: abcdefgh ijklmnop ... - user85421
这很有道理,但是是否可能将其存储为原始状态,即不进行反转? - user8231110
它被存储为原始值,只是你如何表示它的方式与 toBinaryString 的方式不同。 - user85421
"不要写成 == true" - xerx593
1个回答

1

BitSet#toByteArray() javadoc

返回一个包含此位集中所有位的新字节数组。更精确地说,如果..

byte[] bytes = s.toByteArray();

then

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

"and" (这是一个 HTML 代码块,没有具体的上下文信息,无法提供更多翻译内容)
s.get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)

对于所有的 n < 8 * bytes.length

@return 包含此位集中所有位的小端表示的字节数组

@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();
}

..要这样调用:

System.out.println(toBinaryString(bitSet.toByteArray(), 64);

run:
0111111101111111011111100000000000000000000000000000000000000000
0111111101111111011111100000000000000000000000000000000000000000
BUILD SUCCESSFUL (total time: 0 seconds)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接