如何识别byte 的内容是jpeg?

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

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

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

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

我真的需要做什么

 areTheseBytesAJpeg(byte[] mBytes){} 

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

来自维基百科:

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

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

一些关于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 

一些代码:

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

引用这个维基百科文章 :

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

关于幻数(包括JPEG文件)的另一个“知识”来源是GNU / Linux file命令使用的magic文件。

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

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

很多格式都是通过所谓的魔术数字来识别的。 这些字节序列通常位于文件的前面,用于标识以下二进制数据是否真的与您的想法相同。 快速谷歌搜索返回: http : //www.linfo.org/magic_number.html ,特别是引用:

“同样,JPEG(联合图像专家组)图像文件常用的幻数是0x4A464946,它是JFIF(JPEG文件交换格式)的ASCII等价物。但是,JPEG幻数不是文件中的第一个字节;而是它们以第七个字节开头。其他例子包括用于MIDI(乐器数字接口)文件的0x4D546864和用于bzip2压缩文件的0x425a6831415925。

JPG文件确实有一个特定的标题,您可以使用它来确定它是JPG文件的非常好的可能性。 但是,目前尚不清楚是否将整个文件放在字节数组中。

无论如何,这里有关于标题的详细信息: http : //www.fastgraph.com/help/jpeg_header_format.html