Как определить содержимое байта [] является JPEG?
У меня есть небольшой байтовый массив (до 25 КБ), который я получаю и декодирую как часть большого конверта сообщения. Иногда это изображение, а когда оно и изображение, то иногда это jpg. У меня нет никакой контекстной информации, кроме байтового массива, и мне нужно идентифицировать как изображение, так и изображение типа jpg.
Есть ли какое-то магическое число или магические байты, которые существуют в начале, конце или с некоторым смещением, на которое я могу посмотреть, чтобы идентифицировать его?
Пример моего кода выглядит следующим образом (из памяти, а не с / п):
byte[] messageBytesAfterDecode = retrieveBytesFromEnvelope();
if(null != messageBytesAfterDecode && messageBytesAfterDecode > 0){
if(areTheseBytesAJpeg(messageBytesAfterDecode)){
doSomethingWithAJpeg(messageBytesAfterDecode)
}else{
flagEnvelopeAsHavingBadContentInTheField();
}
}
Мне действительно нужно то, что вошло бы в
areTheseBytesAJpeg(byte[] mBytes){}
метод, или даже указатель на спецификацию, которая его детализирует. Я надеюсь, что есть очень быстрый способ сделать это определение, так как я действительно не хочу читать их в изображение и т. Д.
6 ответов
Из википедии:
Файлы изображений JPEG начинаются с FF D8 и заканчиваются FF D9.
Некоторая дополнительная информация о другом формате файла с помощью 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) является magic
файл, используемый GNU/Linux file
команда.
Если у вас есть file
команда установлена, то file --version
скажет вам, где magic
файл живет, и вы можете прочитать его с помощью текстового редактора... и внимательно читать man 5 magic
,
(И magic
содержимое файла подтверждают детали других ответов.)
Цитирую эту статью из Википедии:
Файлы изображений JPEG начинаются с FF D8 и заканчиваются FF D9. Файлы JPEG/JFIF содержат код ASCII для "JFIF" (4A 46 49 46) в виде строки с нулевым окончанием. Файлы JPEG/Exif содержат код ASCII для "Exif" (45 78 69 66) также в виде строки с нулевым символом в конце, за которой следуют дополнительные метаданные о файле.
Многие форматы идентифицируются с помощью так называемых магических чисел. Это байтовые последовательности, которые обычно находятся в начале файла, чтобы определить, действительно ли следующие двоичные данные соответствуют вашим ожиданиям. Быстрый поиск в Google вернул: http://www.linfo.org/magic_number.html и, в частности, цитата:
"Точно так же обычно используемое магическое число для файлов изображений JPEG (Joint Photographic Experts Group) - 0x4A464946, что является ASCII-эквивалентом JFIF (формата обмена файлами JPEG). Однако магические числа JPEG не являются первыми байтами в файле;, они начинаются с седьмого байта. Дополнительные примеры включают 0x4D546864 для файлов MIDI (цифровой интерфейс музыкальных инструментов) и 0x425a6831415925 для сжатых файлов bzip2."
Файл JPG имеет специальный заголовок, который можно использовать для определения очень высокой вероятности того, что это файл JPG. Однако не ясно, будет ли у вас весь файл в байтовом массиве.
Во всяком случае, вот подробности в заголовке: http://www.fastgraph.com/help/jpeg_header_format.html