Java четыре байта в двоичную «битовую маску» - PullRequest
2 голосов
/ 20 января 2011

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

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

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

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

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

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

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

Спасибо.

Tony

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 20 января 2011

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

Альтернативно, если вы читаете байты a, b, c, d:

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

(& 0xff) необходимо для предотвращения расширения старшего байта расширением знакового бита.

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

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

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 голосов
/ 20 января 2011

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

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

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

0 голосов
/ 20 января 2011

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

...