Преобразование BitSet в байт [] - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть BitSet, который необходимо преобразовать в байт [].Однако, используя 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-битные, но первые 0 в BitSet размещаются где-то еще после преобразования.Почему это происходит, и как я могу это исправить?

1 Ответ

0 голосов
/ 06 февраля 2019

С 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...