Java验证图像头

时间:2013-03-21 08:42:39

标签: 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 && ba[i+1] == 0xD8 && ba[i+2] == 0xFF && ba[i+3] == 0xE0){
   System.out.println("isJPEG");
}

但条件并没有让人满意。 ba[i]会返回-1

我做错了什么?

1 个答案:

答案 0 :(得分:2)

在Java中,byte原语已签名,范围为-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");
        }

我不确定你使用的确切逻辑,因为维基百科声称JPEG的幻数如下:

  

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");
        }