Java验证图像头
我有一个要求,我需要确定的类型的图像不是由文件扩展名,而是通过验证头。我正在尝试通过幻数验证来验证JPEG文件Java验证图像头,java,image,bytearray,Java,Image,Bytearray,我有一个要求,我需要确定的类型的图像不是由文件扩展名,而是通过验证头。我正在尝试通过幻数验证来验证JPEG文件 File imgFile = new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"); byte[] ba = Files.toByteArray(imgFile); //Its a google guava library int i = 0; if(ba [i] == 0xFF
File imgFile =
new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library
int i = 0;
if(ba [i] == 0xFF && ba[i+1] == 0xD8 && ba[i+2] == 0xFF && ba[i+3] == 0xE0){
System.out.println("isJPEG");
}
但条件根本没有得到满足ba[i]
返回-1
我做错了什么?在Java中,
字节
原语是有符号的,范围从-128到127,这意味着你的ba[0]
显示为-1
,而0xFF
被解释为一个int,表示255
。如果使用&
运算符对0xFF
执行按位AND运算,则会将有符号字节转换为正确的值,代码将工作,如下所示:
File imgFile =
new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library
int i = 0;
if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[i+2] & 0xFF) == 0xFF
&& (ba[i+3] & 0xFF) == 0xE0) {
System.out.println("isJPEG");
}
但是,我不确定您使用的确切逻辑,因为wikipedia声明JPEG的神奇数字如下:
File imgFile =
new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library
int i = 0;
if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[i+2] & 0xFF) == 0xFF
&& (ba[i+3] & 0xFF) == 0xE0) {
System.out.println("isJPEG");
}
JPEG图像文件以FF D8开头,以FF D9结尾
FF E0
是特定于JFIF的,因此您可能需要再次检查检查此项的原因
以下是根据维基百科进行检查的代码:
File imgFile =
new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library
int i = 0;
if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[ba.length - 2] & 0xFF) == 0xFF
&& (ba[ba.length - 1] & 0xFF) == 0xD9) {
System.out.println("isJPEG");
}
相关人员:谢谢。它成功了。我想我需要更多地研究ditwise操作。不客气。Java中的所有基本数字数据类型都是有符号的,并用二的补码表示法表示,请参见此处:。您会注意到,当用2的补码表示时,无符号255是-1