如何识别byte []的内容是jpeg?

Kyl*_*lar 30 java jpeg image

我有一个小字节数组(25K以下),我收​​到并解码为更大的消息信封的一部分.有时这是一个图像,当它是图像时,有时它是一个jpg.我没有字节数组以外的上下文信息,并且需要识别它是否是图像,以及图像是否为jpg类型.

是否有一些神奇的数字或魔术字节存在于开头,结尾或某些偏移处,我可以看一下来识别它?

我的代码示例如下(来自内存,而不是c/p):

byte[] messageBytesAfterDecode = retrieveBytesFromEnvelope();
if(null != messageBytesAfterDecode && messageBytesAfterDecode > 0){
    if(areTheseBytesAJpeg(messageBytesAfterDecode)){
        doSomethingWithAJpeg(messageBytesAfterDecode)
    }else{
        flagEnvelopeAsHavingBadContentInTheField();
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的需要做什么

areTheseBytesAJpeg(byte[] mBytes){}
Run Code Online (Sandbox Code Playgroud)

方法,甚至指向详细说明的规范的指针.我希望有一个非常快速的方法来做出这个决定,因为我真的不想把它们读成图像等.

zsa*_*ank 55

来自维基百科:

JPEG图像文件以FF D8开头,以FF D9结束.

http://en.wikipedia.org/wiki/Magic_number_(programming)


RAT*_*THI 13

一些关于jpeg的其他文件格式的额外信息:文件的初始值包含这些字节

BMP : 42 4D
JPG : FF D8 FF EO ( Starting 2 Byte will always be same)
PNG : 89 50 4E 47
GIF : 47 49 46 38
Run Code Online (Sandbox Code Playgroud)

一些代码:

private static Boolean isJPEG(File filename) throws Exception {
    DataInputStream ins = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
    try {
        if (ins.readInt() == 0xffd8ffe0) {
            return true;
        } else {
            return false;

        }
    } finally {
        ins.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当JPG文件使用JFIF或EXIF时,签名是不同的:Raw:FF D8 FF DB;JFIF:FF D8 FF E0;EXIF:FF D8 FF E1 (3认同)

Ste*_*n C 9

关于幻数(包括JPEG文件)的"知识"的另一个来源是magicGNU/Linux file命令使用的文件.

如果您安装了file命令,那么file --version将告诉您magic文件所在的位置,并且您可以使用文本编辑器阅读它...并仔细阅读man 5 magic.

(magic文件内容确认其他答案的详细信息.)


小智 6

引用这个维基百科文章:

JPEG图像文件以FF D8开头,以FF D9结束.JPEG/JFIF文件包含"JFIF"(4A 46 49 46)的ASCII代码,作为空终止字符串.JPEG/Exif文件包含"Exif"(45 78 69 66)的ASCII代码,也作为空终止字符串,后跟有关该文件的更多元数据.

  • 但请注意,某些JPEG在该位置既没有4A 46 49 46也没有45 78 69 66(尽管我见过的大多数都是这样).不是这方面的专家,但我正在看那个位置有50 68 6F 74的JPEG; 这对应于"Photoshop"中的ASCII"Phot",虽然我已经从Photoshop中以多种方式保存了JPEG,但我无法复制它.(但是,Photoshop将此文件识别为JPEG,Windows和OS X也是如此.)此文件既不包含JFIF也不包含Exif标记ANYWHERE.最后,文件DOES以FF D8开头并以FF D9结束(因为它应该是JPEG). (2认同)