我正在从二进制文件中读取一堆字节。它是一个 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
我正在玩的文件分别有1100
和0D
12 位。
我无法理解这两个值,因为它们是位标志(我无法理解)。
我在byte
12 字节长的数组中有这两个值。我需要在这个序列中检查是否设置了标志0x0100
和0x0001
。
我迷路了。谢谢。
我在十六进制编辑器中检查了一些文件,我看到的是第 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 档案尝试了这段代码——跨区档案、非跨区档案、跨区档案的第一个文件、跨区档案的另一个文件。
代码本身工作正常,除了一个非常小的怪癖。我从我的十六进制值中得到相反的结果,即
在检查不是跨区存档中第一个文件的文件时,我将卷属性0x0001
设置为未设置 ( false
),并将“第一卷”0x100
设置为 ( true
)。
在检查作为跨区存档中的第一个文件的文件时,我得到了完全相反的结果。
现在我修改我的代码以相信原始规范是错误的(极不可能),这0x0001
意味着这是跨区存档中的第一个文件,并且0x0100
意味着这是跨区存档,那么一切都很好。
..但我想我的位标志逻辑在这里做错了。有任何想法吗?