0

以下は、マジック ナンバーを使用してファイルの MIME タイプを検出するために使用されるコードの抜粋です。

ここで 16 進数に焦点が当てられていることは理解できます。

しかし、なぜints を使用し、なぜ 0xFF とビットごとの AND を使用するのでしょうか?

    byte[] header = new byte[11];
    System.arraycopy(data, 0, header, 0, Math.min(data.length, header.length));
    int c1 = header[0] & 0xff;
    int c2 = header[1] & 0xff;
    int c3 = header[2] & 0xff;
    int c4 = header[3] & 0xff;
    int c5 = header[4] & 0xff;
    int c6 = header[5] & 0xff;
    int c7 = header[6] & 0xff;
    int c8 = header[7] & 0xff;
    int c9 = header[8] & 0xff;
    int c10 = header[9] & 0xff;
    int c11 = header[10] & 0xff;

    if (c1 == 0xCA && c2 == 0xFE && c3 == 0xBA && c4 == 0xBE) // CAFEBABE
    {
        return "application/java-vm";
    }
4

3 に答える 3

3

Java ではbyte、符号付きの型です。たとえば、0xFFabyteは実際には an として -1intです。その結果(byte) 0xFF != 0xFF、混乱する可能性があります。byteそのため、値を に変換するときに値を符号なしとして処理しようとするときは、符号が拡張されたくないときに符号が拡張されないようにint常に記述する必要があります。myByte & 0xFF

于 2014-08-01T22:27:29.977 に答える
2

& 0xff上位ビットを0に設定し、最後の8ビットのみを考慮しています

于 2014-08-01T22:22:11.907 に答える
1
header[0] & 0xff;

ビットをマスキングして、8 ビット/2 バイトのみを生成します。

どうして??

メモリに関しては、8ビットを無駄にする代わりに、intの16ビットの符号なし2の補数から8ビットのみを使用しています。

于 2014-08-01T22:28:13.907 に答える