2013-03-21 10 views
5

ファイルの拡張子ではなくヘッダーを検証することで画像の種類を識別する必要があるという要件が1つあります。私は、マジックナンバー検証によってJPEGファイルを検証しようとしています。Java画像のヘッダーを確認する

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

しかし、条件は全く満足していません。 ba[i]-1を返します。

私は間違っていますか?

+0

関連:http://stackoverflow.com/q/1915317/1055089 – Vrushank

答えて

2

Javaではbyteプリミティブ署名と0xFF255としてintとして解釈されるのに対し、あなたba[0]-1として出てくる意味-128から127までの範囲を有しています。あなたは次のように0xFFが、これは正しい値と動作しますあなたのコードに符号付きバイトを変換&演算子を使用してビット単位のANDを行う場合は、次の

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

私はあなたがしかし、使用している正確なロジックについてはよく分かりません、ウィキペディアは、次のようにJPEGファイルのためのマジックナンバーがあると述べているよう:

JPEG画像ファイルはFF D8で始まり、FF D9で終わる

FF E0がJFIF固有のものですので、あなたをM AYこの

をチェックされている理由をダブルチェックしたいのチェックを行うために使用するコードになり、次のウィキペディアのとおり:

 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

ありがとうございました。私はditwise操作をもっと見る必要があると思う。 – karthick

+0

ようこそ。 Javaのすべてのプリミティブ数値データ型は、2の補数表記で署名され、表現されています(http://en.wikipedia.org/wiki/Two's_complementを参照)。 2の補数で表現すると、符号なし255は-1になります –

関連する問題