Преобразование из массива 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;
}
Но на дискуссионных форумах я видел, что этим методом мы не получим все биты, так как мы потеряем один бит за расчет. Это правда? Нужно ли модифицировать вышеуказанный метод?
Ответы
Ответ 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() не работает должным образом