0

以下是用于使用幻数检测文件的 mime 类型的代码摘录。

我可以理解十六进制是这里的重点。

但是,为什么使用ints 以及为什么使用 0xFF 进行按位与?

    byte[] header = new byte[11];
    System.arraycopy(data, 0, header, 0, Math.min(data.length, header.length));
    int c1 = header[0] & 0xff;
    int c2 = header[1] & 0xff;
    int c3 = header[2] & 0xff;
    int c4 = header[3] & 0xff;
    int c5 = header[4] & 0xff;
    int c6 = header[5] & 0xff;
    int c7 = header[6] & 0xff;
    int c8 = header[7] & 0xff;
    int c9 = header[8] & 0xff;
    int c10 = header[9] & 0xff;
    int c11 = header[10] & 0xff;

    if (c1 == 0xCA && c2 == 0xFE && c3 == 0xBA && c4 == 0xBE) // CAFEBABE
    {
        return "application/java-vm";
    }
4

3 回答 3

3

在 Java 中,byte是有符号类型。例如,0xFFas abyte实际上是 -1 作为 a int。结果是(byte) 0xFF != 0xFF,这可能会令人困惑。因此,在将值转换为 时尝试将byte值视为无符号时int,您应该始终编写myByte & 0xFF以确保在您不希望符号被扩展时不会对其进行扩展。

于 2014-08-01T22:27:29.977 回答
2

& 0xff将高位设置为 0 并仅考虑最后 8 位

于 2014-08-01T22:22:11.907 回答
1
header[0] & 0xff;

将这些位屏蔽为仅生成 8 位/2 字节。

为什么??

内存方面,他们只使用 16 位无符号二进制补码中的 8 位,而不是浪费 8 位。

于 2014-08-01T22:28:13.907 回答