はじめに

Java で byte 型を扱う方法を調べてみたのでまとめてみる.

ByteBuffer クラスをつかう

ByteBuffer クラスを利用すると, byte 型に対するいろいろな操作が簡単にできる.

他のプリミティブ型から byte 型配列 に変換

手順は以下.

  1. ByteBuffer.allocate (size) でメモリ獲得.
  2. putXXX メソッドで獲得したメモリに値を挿入
  3. 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 ();
}

Bookmarks