コンパイラはこれで問題ないようです(1桁の16進値のみ):
byte[] rawbytes={0xa, 0x2, 0xf};
しかし、これではありません:
byte[] rawbytes={0xa, 0x2, 0xff};
「可能性のある精度の低下が見つかりました:int required:byte」エラーが表示されます。
私は何を間違えていますか?または1桁の16進数は特別な場合ですか?
Java1.5.x。
既に述べたように、バイトはJavaの符号付き型です。範囲は-128〜127です。したがって、0xffは-0x01と等しくなります。手動キャストを追加する場合は、-0x01の代わりに0xffを使用できます。
byte[] rawbytes={0xa, 0x2, (byte) 0xff};
可変引数でヘルパー関数を宣言することにより、もう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
}
}
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);
}
「0xFF」は、10進数値255のint
リテラルであり、バイトとして表現できません。
とりあえず、次のようにbyte
にキャストして、コンパイラが本当に-1を意味することを伝える必要があります。
byte[] rawbytes = { 0xA, 0x2, (byte) 0xFF };
Java 7。 に新しいバイトリテラル構文(y
またはY
接尾辞)を追加することが提案されました。
byte[] rawbytes = { 0xA, 0x2, 0xFFy };
しかし、この提案は「改善された整数リテラルのオムニバス提案」に含まれていなかったため、永遠にキャストに固執しています。