Javaでintやdoubleなどのプリミティブ型をbyte配列に変換する

TCPやUDPパケットのデータや、バイナリダンプなど、用途は限られますがJavaのプリミティブ型をbyte配列にしたい時があると思います。

ビット演算子を使用してビットシフトして1バイトずつ処理するのも1つの手ですが、それよりももっと手軽に、そして安全に実現できる方法があったので公開します。

Javaのプリミティブ型 (基本データ型)。

なお、Javaのプリミティブ型は以下の種類があります。

種別 型 サイズ 備考
文字 char 2バイト C言語では1バイト扱いなので多言語使いの方は注意
整数 byte 1バイト
short 2バイト
int 4バイト
long 8バイト
浮動小数 float 4バイト ビット演算子によるシフト不可
double 8バイト ビット演算子によるシフト不可
論理値 boolean VM依存 Java言語仕様で定められていないためサイズについてはVM依存となる

※備考の欄にも書きましたが、C言語などから入ったプログラマーの方はcharのサイズに要注意です。

ByteBuffer#putXXXメソッドを使用します。

もしビットシフトでbyte配列への詰め替えを行うとすれば、ソースの記述が長くなりますし、floatやdoubleはそれぞれFloat#floatToIntBits()、Double#doubleToLongBits()を使って、一度整数型の値を取得しなければなりません。

それがByteBufferクラスに定義されているstaticメソッドを使えば、たった1行でbyte配列への変換が行えます。

以下にユーティリティクラス化したソースコードを記載します。

ParseByteArray.java

※ダブルクリックで全選択できます。

import java.nio.ByteBuffer;

/**
 * プリミティブ型をbyte配列へ変換するクラス
 *
 * @author
 *
 */
public class ParseByteArray {

	/**
	 * byte配列変換
	 *
	 * @param value
	 *            変換対象の値
	 * @return byte配列に変換された値
	 */
	public static byte[] fromChar(char value) {
		int arraySize = Character.SIZE / Byte.SIZE;
		ByteBuffer buffer = ByteBuffer.allocate(arraySize);
		return buffer.putChar(value).array();
	}

	/**
	 * byte配列変換
	 *
	 * @param value
	 *            変換対象の値
	 * @return byte配列に変換された値
	 */
	public static byte[] fromShort(short value) {
		int arraySize = Short.SIZE / Byte.SIZE;
		ByteBuffer buffer = ByteBuffer.allocate(arraySize);
		return buffer.putShort(value).array();
	}

	/**
	 * byte配列変換
	 *
	 * @param value
	 *            変換対象の値
	 * @return byte配列に変換された値
	 */
	public static byte[] fromInt(int value) {
		int arraySize = Integer.SIZE / Byte.SIZE;
		ByteBuffer buffer = ByteBuffer.allocate(arraySize);
		return buffer.putInt(value).array();
	}

	/**
	 * byte配列変換
	 *
	 * @param value
	 *            変換対象の値
	 * @return byte配列に変換された値
	 */
	public static byte[] fromLong(long value) {
		int arraySize = Long.SIZE / Byte.SIZE;
		ByteBuffer buffer = ByteBuffer.allocate(arraySize);
		return buffer.putLong(value).array();
	}

	/**
	 * byte配列変換
	 *
	 * @param value
	 *            変換対象の値
	 * @return byte配列に変換された値
	 */
	public static byte[] fromFloat(float value) {
		int arraySize = Float.SIZE / Byte.SIZE;
		ByteBuffer buffer = ByteBuffer.allocate(arraySize);
		return buffer.putFloat(value).array();
	}

	/**
	 * byte配列変換
	 *
	 * @param value
	 *            変換対象の値
	 * @return byte配列に変換された値
	 */
	public static byte[] fromDouble(double value) {
		int arraySize = Double.SIZE / Byte.SIZE;
		ByteBuffer buffer = ByteBuffer.allocate(arraySize);
		return buffer.putDouble(value).array();
	}
}

char型の扱いについて。

私はC言語からプログラミングを始めたので、char型が2バイトだと言われると何だか違和感を覚えてしまいます。

業務などで過去のプログラムの移植をする時や、または複数人でプログラムを組む時などは、この辺りの認識を明確にさせておかないと痛い目を見るかもしれませんね。気を付けてください。

コメントを残す

このページの先頭へ