Как определить содержимое байта [] является 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.

http://en.wikipedia.org/wiki/Magic_number_%28programming%29

Некоторая дополнительная информация о другом формате файла с помощью 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

Другие вопросы по тегам