はじめに
Java で byte 型を扱う方法を調べてみたのでまとめてみる.
ByteBuffer クラスをつかう
ByteBuffer クラスを利用すると, byte 型に対するいろいろな操作が簡単にできる.
他のプリミティブ型から byte 型配列 に変換
手順は以下.
- ByteBuffer.allocate (size) でメモリ獲得.
- putXXX メソッドで獲得したメモリに値を挿入
- array () で byte 配列に変換
ByteBuffer buffer = ByteBuffer.allocate (arraySize);
buffer = buffer.putXXXX (value)
byte[] bytes = buffer.array ();
Sample
import java.nio.ByteBuffer;
class ByteSample {
public static void main (String args[]) {
showBytes (short2Byte ((short) 10));
showBytes (int2Byte (10));
showBytes (int2ByteN (10));
showBytes (long2Byte (10L));
}
public static byte[] short2Byte (short value) {
return ByteBuffer.allocate (Short.SIZE/Byte.SIZE).putShort (value).array ();
}
public static byte[] int2Byte (int value) {
return ByteBuffer.allocate (Integer.SIZE/Byte.SIZE).putInt (value).array ();
}
public static byte[] long2Byte (long value) {
return ByteBuffer.allocate (Long.SIZE/Byte.SIZE).putLong (value).array ();
}
static void showBytes (byte[] bytes) {
for (int i=0; i < bytes.length; i++)
System.out.printf (Integer.toHexString (bytes[i] &0xff));
System.out.println ("");
}
}
出力結果
0a
000a
0000000a
エンディアン対応
ByteBuffer の初期順序は, BIG_ENDIAN.
- ビッグエンディアン
複数バイトのデータを上位バイトから順番に格納する方式です. 0x1234ABCD を 0x12,0x34,0xAB,0xCD という順番で保存します.
- リトルエンディアン
複数バイトのデータを下位バイトから順番に格納する方式です. 0x1234ABCD を 0xCD,0xAB,0x34,0x12 という順番で保存します.
リトルエンディアン (ネットワークバイトオーダー) に対応するためには, java.nio.ByteOrder クラスと order メソッドを利用する.
public static byte[] int2ByteN (int value) {
ByteBuffer byteBuffer = ByteBuffer.allocate (Integer.SIZE/Byte.SIZE);
byteBuffer.order (ByteOrder.LITTLE_ENDIAN);
byteBuffer.putInt (value);
return byteBuffer.array ();
}