Comment identifier le contenu d’un octet est un JPEG?

J’ai un petit tableau d’octets (moins de 25 Ko) que je reçois et que je décode dans le cadre d’une plus grande enveloppe de message. Parfois, il s’agit d’une image, et quand il s’agit d’une image, c’est parfois un jpg. Je n’ai aucune information de contexte autre que le tableau d’octets et j’ai besoin d’identifier à la fois si c’est une image et si l’image est de type jpg.

Y a-t-il un nombre magique ou des octets magiques qui existent au début, à la fin ou à un décalage que je peux examiner pour l’identifier?

Voici un exemple de mon code (de la mémoire, pas de c / p):

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

J’ai vraiment besoin de ce qui irait dans le

 areTheseBytesAJpeg(byte[] mBytes){} 

méthode, ou même un pointeur sur une spécification qui la détaille. J’espère qu’il y a un moyen très rapide de prendre cette décision, car je ne veux pas vraiment les lire dans une image, etc.

De wikipedia:

Les fichiers d’image JPEG commencent par FF D8 et se terminent par FF D9.

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

Quelques informations supplémentaires sur un autre format de fichier avec JPEG: l’initiale du fichier contient ces octets

 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 

un code:

 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(); } } 

Citant cet article de wikipedia :

Les fichiers d’image JPEG commencent par FF D8 et se terminent par FF D9. Les fichiers JPEG / JFIF contiennent le code ASCII pour “JFIF” (4A 46 49 46) en tant que chaîne terminée par un caractère null. Les fichiers JPEG / Exif contiennent le code ASCII pour “Exif” (45 78 69 66) également sous forme de chaîne terminée par un caractère nul, suivie de plus de métadonnées sur le fichier.

Le fichier magic utilisé par la commande de file GNU / Linux est une autre source de “connaissances” sur les nombres magiques (y compris pour les fichiers JPEG).

Si vous avez installé la commande file , alors file --version vous indiquera l’emplacement du fichier magic et vous pourrez le lire à l’aide d’un éditeur de texte … et d’une lecture attentive de man 5 magic .

(Et le contenu du fichier magic confirme les détails des autres réponses.)

Beaucoup de formats sont identifiés par ce qu’on appelle des nombres magiques. Ce sont des séquences d’octets généralement situées au début du fichier pour déterminer si les données binarys suivantes sont réellement ce que vous pensez. Une recherche rapide sur Google a renvoyé: http://www.linfo.org/magic_number.html et plus précisément la citation:

“De même, un nombre magique couramment utilisé pour les fichiers image JPEG (Joint Photographic Experts Group) est 0x4A464946, qui est l’équivalent ASCII de JFIF (JPEG File Interchange Format). Cependant, les nombres magiques JPEG ne sont pas les premiers octets du fichier; , ils commencent par le septième octet. Des exemples supplémentaires incluent 0x4D546864 pour les fichiers MIDI (interface numérique d’instrument de musique) et 0x425a6831415925 pour les fichiers compressés bzip2. ”

Un fichier JPG a un en-tête spécifique que vous pouvez utiliser pour déterminer une très bonne probabilité qu’il s’agisse d’un fichier JPG. Cependant, il n’est pas clair si vous avez tout le fichier dans le tableau d’octets.

Quoi qu’il en soit, voici les détails sur l’en-tête: http://www.fastgraph.com/help/jpeg_header_format.html