Java验证图像头

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

我有一个要求,我需要确定的类型的图像不是由文件扩展名,而是通过验证头。我正在尝试通过幻数验证来验证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 && 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