[英]Mimetype detection - What is the purpose of & 0xff in this code?
以下是用于使用幻数检测文件的mime类型的代码的摘录。
我可以理解十六进制是这里的重点。
但是,为什么要使用int
,为什么要与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";
}
在Java中, byte
是带符号的类型。 例如, 0xFF
作为byte
实际上是-1作为int
。 结果是(byte) 0xFF != 0xFF
,这可能会造成混淆。 因此,当尝试将byte
值转换为int
时将其视为无符号时,应始终写入myByte & 0xFF
以确保在不希望出现符号时不将其扩展。
& 0xff
将高位设置为0,仅考虑最后8位
header[0] & 0xff;
屏蔽位以仅生成8位/ 2字节。
为什么??
在内存方面 ,它们只使用16位无符号二进制int的补码中的8位,而不是浪费8位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.