Преобразование из BitSet в байтовый массив - PullRequest
14 голосов
/ 01 июня 2011

Я взял этот пример, который преобразует 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;
}

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

Ответы [ 4 ]

15 голосов
/ 01 июня 2011

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

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

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

Это дает место для столько бит, сколько требуется, но не более.По сути это эквивалентно «Делить на 8, но всегда округлять».

10 голосов
/ 14 декабря 2012

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

байт [bytes.length-i / 8-1] | = 1 << (i% 8); </p>

до:

байт [i / 8] | = 1 << (7-i% 8); </p>

3 голосов
/ 01 июня 2011

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

1 голос
/ 20 января 2015

FYI, использование

bits.length()

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...