以下是用于使用幻数检测文件的mime类型的代码的摘录。
我可以理解十六进制是这里的重点。
但是,为什么使用int
s和为什么按位AND与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";
}
答案 0 :(得分:3)
在Java中,byte
是签名类型。例如,0xFF
作为byte
实际上是-1作为int
。结果是(byte) 0xFF != 0xFF
,这可能令人困惑。因此,在将byte
值转换为int
时,尝试将myByte & 0xFF
值视为未签名时,您应该始终写{{1}}以确保在您不使用该符号时不会延长该符号希望它成为。
答案 1 :(得分:2)
& 0xff
将高位设置为0,只考虑最后8位
答案 2 :(得分:1)
header[0] & 0xff;
将这些位屏蔽为仅生成8位/ 2字节。
为什么?
记忆明智,而不是浪费8位,他们只使用16位无符号2对int的补充中的8位。