Как преобразовать битовый набор, инициализированный с помощью false, в байт, содержащий 0 в java

Я работаю над небольшим java-проектом, целью которого является преобразование BitSet в несколько BitSet, а затем в несколько массивов байтов:

Например, я хочу разделить BitSet на две части и преобразовать каждую часть в int :

    byte[] bytesToBeConverted = {(byte)0x05, (byte)0x00};
    BitSet bitSetToBeConverted = BitSet.valueOf(bytesToBeConverted);

BitSet BitSetPart1 =new BitSet(8);
BitSetPart1=bitSetToBeConverted.get(0,8);
int intPart1 = (int)(BitSetPart1.toByteArray()[0]); //intPart1 ==5

BitSet BitSetPart2 =new BitSet(8);
BitSetPart2 = bitSetToBeConverted.get(8,16);
int intPart2 = (int)(BitSetPart2.toByteArray()[0]); //intPart2 == 0 is wanted

В то время как в первой части проблем не возникает (преобразование bitSetPart1 в intPart1), во второй части, где BitSetpart2 должен быть инициализирован значением false, возникает исключение при доступе к результату метода toByteArray() :java.lang В этом случае .ArrayIndexOutOfBoundsException toByteArray, похоже, возвращает null.

Означает ли это, что ноль является запрещенным значением для этого типа операций? В этом случае вы бы предпочли расширить класс BitSet и переопределить метод toByteArray()? или создать класс, полностью отделенный от BitSet, с дополнительным методом для решения этой проблемы?

или есть другой способ выполнить такую ​​​​операцию, о которой я не упомянул?

Большое спасибо за ваши ответы!


person Kate_Bush    schedule 26.06.2012    source источник


Ответы (2)


Из Javadoc toByteArray():

Точнее, если

byte[] bytes = s.toByteArray(); 

тогда

bytes.length == (s.length()+7)/8

и из Javadoc length():

Возвращает «логический размер» этого BitSet: индекс старшего установленного бита в BitSet плюс один. Возвращает ноль, если BitSet не содержит установленных битов.

Поскольку второй BitSet не содержит установленных битов, он возвращает массив нулевой длины, как ясно указано в Javadoc.

Если вы хотите дополнить результат toByteArray() до указанного количества байтов, используйте Arrays.copyOf(bitSet.toByteArray(), desiredLength).

person Louis Wasserman    schedule 26.06.2012
comment
Большое спасибо! И вообще, вы бы предпочли переопределить метод toByteArray() в расширяющем классе или создать статический метод для инкапсуляции оригинального BitSet.toByteArray()? - person Kate_Bush; 26.06.2012
comment
@Kate_Bush Переопределение метода toByteArray нарушит его контракт. Как правило, если вы не можете обеспечить (или намеренно нарушите) принцип подстановки Лискова, наследование не является решением. - person alf; 26.06.2012
comment
Верно. Предоставьте другой метод для получения желаемого результата от BitSet; не продлевайте его и не нарушайте его контракт. (Действительно, он должен быть окончательным...) - person Louis Wasserman; 26.06.2012

Пустой набор битов возвращает пустой массив, поэтому получение [0] действительно недопустимо.

Пытаться

BitSetPart2 = bitSetToBeConverted.get(8,16);
byte[] temp = BitSetPart2.toByteArray();
int intPart2 = temp.length == 0 ? 0 : (int)(temp[0]); 

вместо

person alf    schedule 26.06.2012