Подтвердить что ты не робот

Как определить содержимое байта [] в формате JPEG?

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

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

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

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

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

areTheseBytesAJpeg(byte[] mBytes){}

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

4b9b3361

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

Цитата эта статья в википедии:

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

Ответ 5

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

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

Ответ 6

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

В любом случае, здесь специфика в заголовке: http://www.fastgraph.com/help/jpeg_header_format.html