web-dev-qa-db-ja.com

16進表記を使用したbyte []配列のリテラル構文..?

コンパイラはこれで問題ないようです(1桁の16進値のみ):

byte[] rawbytes={0xa, 0x2, 0xf};

しかし、これではありません:

byte[] rawbytes={0xa, 0x2, 0xff};

「可能性のある精度の低下が見つかりました:int required:byte」エラーが表示されます。

私は何を間違えていますか?または1桁の16進数は特別な場合ですか?

Java1.5.x。

47
monojohnny

既に述べたように、バイトはJavaの符号付き型です。範囲は-128〜127です。したがって、0xffは-0x01と等しくなります。手動キャストを追加する場合は、-0x01の代わりに0xffを使用できます。

byte[] rawbytes={0xa, 0x2, (byte) 0xff};
47

可変引数でヘルパー関数を宣言することにより、もう1つの可能性があります。これは、複数のバイト配列を宣言する必要がある場合に適しています。

サンプルコード

public static byte[] toBytes(int... ints) { // helper function
    byte[] result = new byte[ints.length];
    for (int i = 0; i < ints.length; i++) {
        result[i] = (byte) ints[i];
    }
    return result;
}

public static void main(String... args) {

    byte[] rawbytes = toBytes(0xff, 0xfe); // using the helper

    for (int i = 0; i < rawbytes.length; i++) {
        System.out.println(rawbytes[i]); // show it works
    }
}
12
Eero Aaltonen

byteは署名され、0xff = 255が大きすぎます。有効な範囲は(-128 .. 127)です。

サンプルコード:

public static void main(String[] args) {
    byte b = (byte) 0xff;    // = -1
    int i = b;               // = -1
    int j = b & 0xff;        // = 255

    System.out.printf("b=%s, i=%s, j=%s", b,i,j);
}
8
Andreas_D

「0xFF」は、10進数値255のintリテラルであり、バイトとして表現できません。

とりあえず、次のようにbyteにキャストして、コンパイラが本当に-1を意味することを伝える必要があります。

byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF };

Java 7。 に新しいバイトリテラル構文(yまたはY接尾辞)を追加することが提案されました。

byte[] rawbytes = { 0xA, 0x2, 0xFFy };

しかし、この提案は「改善された整数リテラルのオムニバス提案」に含まれていなかったため、永遠にキャストに固執しています。

8
erickson