5

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

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

私は何が間違っているのですか?

4

1 に答える 1

3

Java では、プリミティブは署名されbyteており、範囲は -128 から127です。演算子を使用してビットごとの AND を実行すると、符号付きバイトが正しい値に変換され、次のようにコードが機能します。ba[0]-10xFF2550xFF&

    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 固有であるため、これを確認する理由を再確認することをお勧めします。

以下は、ウィキペディアに従ってチェックを行うために使用するコードです。

        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");
        }
于 2013-03-21T09:08:02.930 に答える