Подтвердить что ты не робот

Преобразование из массива BitSet в Byte

Я взял этот пример из здесь, который преобразует BitSet в массив байтов.

public static byte[] toByteArray(BitSet bits) {
    byte[] bytes = new byte[bits.length()/8+1];
    for (int i=0; i<bits.length(); i++) {
        if (bits.get(i)) {
            bytes[bytes.length-i/8-1] |= 1<<(i%8);
        }
    }
    return bytes;
}

Но на дискуссионных форумах я видел, что этим методом мы не получим все биты, так как мы потеряем один бит за расчет. Это правда? Нужно ли модифицировать вышеуказанный метод?

4b9b3361

Ответ 1

Нет, это хорошо. Комментарий к сообщению был связан с другим фрагментом кода в сообщении, преобразованием из массива байтов в BitSet. По правде говоря, я использовал бы скорее пробел.

Также это может закончиться массивом, который больше, чем нужно. Выражение создания массива может быть:

byte[] bytes = new byte[(bits.length() + 7) / 8];

Это дает место для как можно большего количества бит, но не более того. В основном это эквивалентно "Разделить на 8, но всегда округлять".

Ответ 2

Если вам нужно BitSet в обратном порядке из-за проблем с endian, измените:

bytes [bytes.length-i/8-1] | = 1 < < (i% 8);

в

bytes [i/8] | = 1 < (7-i% 8);

Ответ 3

Это отлично работает для меня. если вы используете Java 1.7, то он имеет метод toByteArray().

Ответ 4

FYI, используя

bits.length()

выбор размера бита может возвращать неверные результаты; Мне пришлось изменить исходный пример, чтобы использовать метод size() для получения определенного размера битового набора (в то время как length() возвращает количество установленных битов). См. Ниже приведенную ниже тему.

java.util.BitSet - set() не работает должным образом