我有一个小字节数组(25K以下),我接收并解码为更大的消息信封的一部分。有时这是一个图像,当它是图像时,有时它是一个jpg。我没有字节数组以外的上下文信息,并且需要识别它是否是图像,以及图像是否为jpg类型。
是否有一些神奇的数字或魔术字节存在于开头,结尾或某些偏移处,我可以看一下来识别它?
我的代码示例如下(来自内存,而不是c / p):
byte[] messageBytesAfterDecode = retrieveBytesFromEnvelope();
if(null != messageBytesAfterDecode && messageBytesAfterDecode > 0){
if(areTheseBytesAJpeg(messageBytesAfterDecode)){
doSomethingWithAJpeg(messageBytesAfterDecode)
}else{
flagEnvelopeAsHavingBadContentInTheField();
}
}
我真的需要进入
的内容areTheseBytesAJpeg(byte[] mBytes){}
方法,甚至指向详细说明的规范的指针。我希望有一个非常快速的方法来做出这个决定,因为我真的不想将它们读成图像等。
答案 0 :(得分:51)
答案 1 :(得分:10)
有关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();
}
}
答案 2 :(得分:6)
关于幻数(包括JPEG文件)的另一个“知识”来源是GNU / Linux magic
命令使用的file
文件。
如果您安装了file
命令,那么file --version
将告诉您magic
文件所在的位置,您可以使用文本编辑器阅读它...并仔细阅读man 5 magic
。
(magic
文件内容确认其他答案的详细信息。)
答案 3 :(得分:5)
JPEG图像文件以FF D8和 用FF D9结束。 JPEG / JFIF文件 包含“JFIF”的ASCII代码(4A 46 49 46)作为空终止字符串。 JPEG / Exif文件包含ASCII代码 对于“Exif”(45 78 69 66)也作为一个 null终止字符串,后跟 有关该文件的更多元数据。
答案 4 :(得分:3)
许多格式都是通过所谓的魔术数字来识别的。这些是通常位于文件前面的字节序列,用于识别以下二进制数据是否真的与您的想法完全相同。快速谷歌搜索返回:http://www.linfo.org/magic_number.html,特别是引用:
“同样,JPEG(联合图像专家组)图像文件常用的幻数是0x4A464946,它是JFIF(JPEG文件交换格式)的ASCII等价物。但是,JPEG幻数不是第一个字节。文件;相反,它们以第七个字节开头。其他示例包括用于MIDI(乐器数字接口)文件的0x4D546864和用于bzip2压缩文件的0x425a6831415925。“
答案 5 :(得分:0)
JPG文件确实有一个特定的标题,您可以使用它来确定它是JPG文件的可能性非常高。但是,目前尚不清楚是否将整个文件放在字节数组中。
无论如何,这里有关于标题的详细信息:http://www.fastgraph.com/help/jpeg_header_format.html