Как определить содержимое байта [] является JPEG? - PullRequest
28 голосов
/ 29 декабря 2010

У меня есть небольшой байтовый массив (до 25 КБ), который я получаю и декодирую как часть большого конверта сообщения.Иногда это изображение, а когда оно и изображение, то иногда это jpg.У меня нет никакой контекстной информации, кроме байтового массива, и мне нужно идентифицировать как изображение, так и изображение типа jpg.

Есть ли какое-то магическое число или магические байты, которые существуют в начале, конце или с некоторым смещением, на которое я могу посмотреть, чтобы идентифицировать его?

Пример моего кода выглядит следующим образом (из памяти, а не с / п):

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

Мне действительно нужно то, что войдет в

areTheseBytesAJpeg(byte[] mBytes){}

метод, или даже указатель на спецификацию, которая его детализирует.Я надеюсь, что есть очень быстрый способ сделать это определение, так как я действительно не хочу читать их в изображение и т. Д.

Ответы [ 6 ]

51 голосов
/ 29 декабря 2010

Из википедии:

Файлы изображений JPEG начинаются с FF D8 и заканчиваются FF D9.

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

12 голосов
/ 19 мая 2016

Некоторая дополнительная информация о другом формате файла с помощью 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();
    }
}
6 голосов
/ 29 декабря 2010

Другим источником «знаний» о магических числах (в том числе для файлов JPEG) является файл magic, используемый командой GNU / Linux file.

Если у вас установлена ​​команда file, то file --version сообщит вам, где находится файл magic, и вы сможете прочитать его с помощью текстового редактора ... и внимательно прочитать man 5 magic.

(А содержимое файла magic подтверждает подробности других ответов.)

5 голосов
/ 29 декабря 2010

Цитирование этой статьи в Википедии :

Файлы изображений JPEG начинаются с FF D8 и заканчиваются FF D9.Файлы JPEG / JFIF содержат код ASCII для «JFIF» (4A 46 49 46) в виде строки с нулевым окончанием.Файлы JPEG / Exif содержат код ASCII для «Exif» (45 78 69 66) также в виде строки с нулевым символом в конце, за которой следуют дополнительные метаданные о файле.

3 голосов
/ 29 декабря 2010

Многие форматы идентифицируются с помощью так называемых магических чисел.Это байтовые последовательности, которые обычно находятся в начале файла, чтобы определить, действительно ли следующие двоичные данные соответствуют вашим ожиданиям.Быстрый поиск в Google вернул: http://www.linfo.org/magic_number.html и, в частности, цитату:

"Точно так же обычно используемое магическое число для файлов изображений JPEG (Joint Photographic Experts Group) - 0x4A464946, что является эквивалентом ASCIIJFIF (формат обмена файлами JPEG). Однако магические числа JPEG не являются первыми байтами в файле, они начинаются с седьмого байта. Дополнительные примеры включают 0x4D546864 для файлов MIDI (цифровой интерфейс музыкальных инструментов) и 0x425a6831415925 для сжатых файлов bzip2. "

0 голосов
/ 29 декабря 2010

Файл JPG имеет специальный заголовок, который можно использовать для определения очень высокой вероятности того, что это файл JPG. Однако не ясно, будет ли у вас весь файл в байтовом массиве.

В любом случае, вот особенности в шапке: http://www.fastgraph.com/help/jpeg_header_format.html

...