将 BitSet 转换为 Byte[]

use*_*110 5 java arrays bitset

我有一个 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));
        }

    }
Run Code Online (Sandbox Code Playgroud)

输出:

Bitset: 0111111101111111011111100000000000000000000000000000000000000000
Converted Byte: 1111111011111110011111100000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

它们都是 64 位,但 BitSet 中的第一个 0 在转换后被放置在其他地方。为什么会发生这种情况,我该如何解决?

xer*_*593 1

来自BitSet#toByteArray() javadoc

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

byte[] bytes = s.toByteArray();
Run Code Online (Sandbox Code Playgroud)

然后

bytes.length == (s.length()+7)/8
Run Code Online (Sandbox Code Playgroud)

s.get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)
Run Code Online (Sandbox Code Playgroud)

对全部n < 8 * bytes.length

@return 一个字节数组,其中包含该位集中所有位的小端表示

@自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();
}
Run Code Online (Sandbox Code Playgroud)

..这样称呼它:

System.out.println(toBinaryString(bitSet.toByteArray(), 64);
Run Code Online (Sandbox Code Playgroud)
run:
0111111101111111011111100000000000000000000000000000000000000000
0111111101111111011111100000000000000000000000000000000000000000
BUILD SUCCESSFUL (total time: 0 seconds)
Run Code Online (Sandbox Code Playgroud)