簡體   English   中英

將BitSet轉換為Byte []

[英]Converting BitSet to Byte[]

我有一個BitSet,需要將其轉換為Byte []。 但是,通過使用BitSet.toByteArray(),我沒有得到正確的輸出。 我已嘗試將Byte []轉換為其二進制形式,以檢查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放置在轉換后的其他位置。 為什么會發生這種情況,我該如何解決?

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

@返回一個字節數組,其中包含該位集中所有位的小端序表示

@ 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM