2011-01-20 4 views
2

Я пытаюсь взять четыре байта из двоичного файла и превратить их в битовую маску, которая представляет нуль для данных и 1 для метаданных.Java четыре байта для двоичной «битмаски»

Я предполагаю, что мне нужно преобразовать их в int путем их или вместе с ними, а затем сдвинуть бит, чтобы определить, установлено ли положение бит или нет.

Не могу понять, как объединить все четыре вместе, чтобы получить 32-разрядную маску, которую я могу сделать.

int mask = (((int)hbyte) & 0xff) << 8 | (((int)lbyte) & 0xff); 

Это было бы объединить два вместе (пост Лоуренса Гонсалвес из другого поста), но я не могу понять синтаксис, чтобы получить четыре вместе.

Или это будет случай для Enumset, который я признаю, что я не совсем понимаю.

Любые советы будут оценены.

Спасибо.

Tony

** Просто чтобы добавить еще одну заметку, к этому, (я не уверен, что это вообще разрешено, поэтому я заранее извиняюсь, если это не так), что это лучший способ идти через мой вновь создал int и проверил, установлен ли бит или нет?

В настоящее время я использую if (((comboOfBytes >> bitmaskBit) & 1) == 0), но я не знаю, если это самый элегантный способ сделать проверку, которая мне нужна.

Кроме того, я все еще не совсем уверен, понимаю ли я, насколько смещение фактически позволяет проверять все 32 бита!

Еще раз спасибо

ответ

2

Вы можете использовать DataInputStream, чтобы читать 4 байта как int из вашего файла.

С другой стороны, если вы читаете байты A, B, C, D:

int comboOfBytes = ((a & 0xff) << 24) | ((b & 0xff) << 16) | ((c & 0xff) << 8) | (d & 0xff); 

The (& 0xff) необходимо, чтобы предотвратить разрядную знаковое сбивание высших байт.

+0

Большое спасибо Майку. Это просто работа! – Tony

1

Я всегда использую следующий

public static int compose(byte x3, byte x2, byte x1, byte x0) { 
    return (x3 << 24) 
      + ((x2 & 0xFF) << 16) 
      + ((x1 & 0xFF) << 8) 
      + ((x0 & 0xFF) << 0); 
} 

Однако, вы можете использовать вместо DataStream.

И нет, EnumSet - это не путь. EnumSet - это просто эффективная реализация Set, специализированного для Enums. У него нет возможностей ввода-вывода без сериализации.

+0

Я считаю, что это превосходит решение Майка Самуэля, потому что оно позволяет создавать битмаску с менее чем 4 байтами. Я предлагаю окончательные параметры, чтобы помочь устранить ошибки обслуживания. – DwB

+1

OT: Я никогда не использую конечные параметры, так как он делает список параметров очень длинным и трудным для чтения. Тем не менее, я мог бы жить со всеми параметрами, являющимися окончательными по умолчанию. – maaartinus

0

EnumSet - это набор элементов Enum. Вероятно, вы имеете в виду BitSet

0

Я не знаю, какой большой контекст вы делаете, но если вы контролируете структуру данных, если вам нужно 32 флага, я подозреваю, что было бы намного проще просто создать boolean [32].

Да, бит-флаги сохраняют память, но если у вас их нет, это, вероятно, неважно.

Я не говорю, что никогда не бывает времени, когда int, состоящий из кучки бит-флагов, а затем используемого для маскирования потока данных, не очень хорошая идея, но я думаю, что это редко бывает хорошей идеей.

+0

Джей, ты прав, это не очень хорошая идея, и это приводит к массивным головным болям! :) Это часть алгоритма сжатия Microsoft, и он использует 4-байтовую битовую маску для обозначения местоположения данных и метаданных в потоке. Я думаю, что причина, по которой у меня возникают проблемы, связана с тем, как Java читает байты. – Tony