2013-03-21 8 views
5

Ich habe eine Anforderung, wo ich den Typ des Bildes nicht durch die Dateierweiterung identifizieren muss, sondern indem ich die Kopfzeile validiere. Ich versuche eine JPEG-Datei durch eine Validierung der Zahlen zu validieren.Java validiere Bildkopf

File imgFile = 
    new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"); 
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library 
int i = 0; 
if(ba [i] == 0xFF && ba[i+1] == 0xD8 && ba[i+2] == 0xFF && ba[i+3] == 0xE0){ 
    System.out.println("isJPEG"); 
} 

Aber der Zustand wird überhaupt nicht befriedigt. ba[i] gibt -1 zurück.

Was mache ich falsch?

+0

Verwandte: http://stackoverflow.com/q/1915317/1055089 – Vrushank

Antwort

2

In Java die byte primitive unterzeichnet und hat eine Reichweite von -128 bis 127, was bedeutet, Ihre ba[0] als -1 kommt, während 0xFF als int als 255 interpretiert wird. Wenn Sie eine bitweise tun und mit 0xFF mit dem & Operator dies das signierte Byte auf den richtigen Wert und Ihr Code funktioniert wandelt, wie folgt:

File imgFile = 
      new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"); 
     byte[] ba = Files.toByteArray(imgFile); //Its a google guava library 
     int i = 0; 
     if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[i+2] & 0xFF) == 0xFF 
      && (ba[i+3] & 0xFF) == 0xE0) { 
      System.out.println("isJPEG"); 
     } 

Ich bin mir nicht sicher über die genaue Logik, die Sie jedoch verwenden , wie wikipedia heißt es, dass die magischen Zahlen für JPEGs sind wie folgt:

JPEG-Bilddateien beginnen mit FF D8 und enden mit FF D9

FF E0 ist JFIF spezifisch, so dass Sie m ay wollen überprüfen, verdoppeln, warum Sie sich für diese

Das sind die Überprüfung folgende würde den Code zu verwenden, um die Kontrollen zu machen, wie pro Wikipedia:

 File imgFile =     
        new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg"); 
     byte[] ba = Files.toByteArray(imgFile); //Its a google guava library 
     int i = 0; 
     if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[ba.length - 2] & 0xFF) == 0xFF 
      && (ba[ba.length - 1] & 0xFF) == 0xD9) { 
      System.out.println("isJPEG"); 
     } 
+0

Danke. Es hat funktioniert. Ich denke, ich muss mehr in ditwise Operationen sehen. – karthick

+0

Gern geschehen. Alle primitiven numerischen Datentypen in Java werden signiert und in Zweierkomplement-Notation dargestellt, siehe hier: http://en.wikipedia.org/wiki/Two's_complement. Sie werden feststellen, dass der vorzeichenlose Wert 255 -1 ist, wenn er in Zweierkomplement dargestellt wird –