Я читаю кучу байтов из двоичного файла. Это файл RAR. Я заинтересован в 11-м и 12-м байтах файла, так как состояние спецификации заголовка:Как читать в шестнадцатеричных значениях из двоичного файла и расшифровывать некоторые байты, содержащие значения битфлага?
HEAD_FLAGS Битовые флаги: 2 байта
0x0001 - Volume attribute (archive volume) 0x0002 - Archive comment present RAR 3.x uses the separate comment block and does not set this flag. 0x0004 - Archive lock attribute 0x0008 - Solid attribute (solid archive) 0x0010 - New volume naming scheme ('volname.partN.rar') 0x0020 - Authenticity information present RAR 3.x does not set this flag. 0x0040 - Recovery record present 0x0080 - Block headers are encrypted 0x0100 - First volume (set only by RAR 3.0 and later) other bits in HEAD_FLAGS are reserved for internal use
Файл, который я играю с имеет 00
и 0D
как позиции 11 и 12 соответственно.
Я не могу понять эти два значения, поскольку они являются битовыми флагами (которые я не понял).
У меня эти два значения в массиве byte
, длина которого составляет 12 байтов. Что мне нужно проверить в этой последовательности, установлен ли флаг 0x0100
и 0x0001
.
Я потерялся с этим. Благодарю.
Я осмотрела некоторые файлы в редакторе Hex и то, что я видел в том, что 11-й и 12-й байт нужно читать вместе. Вот почему спецификации перечисляют все битовые флаги - это 4-х буквенные шестнадцатеричные коды. Проверка флажков бит индивидуально дает неверные результаты.
Ассимилируя как можно больше информации из ответов/советов, «ве решил эту проблему следующим образом:
FileInputStream fisFileInputStream = new FileInputStream((new File("C:\\testarchive.r00"));
byte[] bytHeader = new byte[20]; //The first 20 bytes are the RAR header.
fisFileInputStream.read(bytHeader);
short val=(short)(((bytHeader[10]&0xFF)<<8) | (bytHeader[11]&0xFF)); //Joining the two bytes into a short
System.out.println("Volume Attribute (0x0001): " + ((val & 0x0001) != 0));
System.out.println("First volume (0x0100): " + ((val & 0x0100) != 0));
Я попробовал этот код с несколькими RAR архивов - охватывали те, не натянутый один, первый файл сложенного архива, другой файл запатентованного архива.
Сам код работает отлично, за исключением очень незначительной причуды. Я получаю противоположные результаты моих шестнадцатеричных значений, т.е.
При проверке файла, который не является первым файлом в составном архиве, я получаю объем atrribute 0x0001
не установлен (false
) и «Первый том» 0x100
as комплект (true
).
При проверке файла, который является первым файлом, который находится в развернутом архиве, я получаю абсолютно противоположные результаты.
Теперь я могу изменить свой код, чтобы поверить, что исходные данные неверны (очень маловероятно), и что 0x0001
означает, что является первым файл в составном архиве и 0x0100
означает, что является составным архив, то все в порядке.
.. но я думаю, что я делаю что-то не так с моей логикой битового флага. Есть идеи?
Это может помочь: http://stackoverflow.com/questions/1092411/java-checking-if-a-bit-is-0-or-1-in-a-long – biziclop
Это выглядело полезным.Я думал, что попробую это решение: http://stackoverflow.com/a/1092551/304151. Поскольку мои флаги находятся в двух байтах, я должен суммировать их, когда я инициализирую объект BigInteger. Согласно JavaDocs, он принимает 'Long'. Спасибо, –