CLOVER🍀

That was when it all began.

Javaでbyte配列から、別のプリミティブ型に変換する

追記
最後にNIOのByteBufferを使用した方法を書いているのですが、こちらについて見たい方はこちらへ。

NIOのByteBufferを使って、プリミティブ型とbyte配列の相互変換を行う
http://d.hatena.ne.jp/Kazuhira/20131001/1380638997


少し前に、Cassandraを使ってbyte配列からlongとかに変換しようとした時に、ちょっと調べたので。

byte配列→String、もしくはString→byte配列ならよくやると思いますが、他の型への変換って、やったことなかったです…。

例えば、longの以下の値

123456789L

をbyte配列から、longに戻すことをコードを書くと、以下のようになります。

なお、ここからのサンプルコードは、ビッグエンディアンが前提となっております…。

// longは8バイト
byte[] bytes = {0, 0, 0, 0, (byte)7, (byte)91, (byte)205, (byte)21};  // 123456789L

long longValue = 0L;

for (int i = 0; i < bytes.length; i++) {
    longValue = (longValue << 8) + (bytes[i] & 0xff);
}

/* もしくは、以下のような感じで
for (byte b : bytes) {
    longValue = (longValue << 8) + (b & 0xff);
 }
*/

最後のlongValueを出力すると、

System.out.println("long Value => " + longValue);

一応、期待する値が得られます。

long Value => 123456789

今度は、先ほどのlongValueを自分でbyte配列に変換してみます。

int longByteSize = 8;

byte[] encoded = new byte[longByteSize];  // longは8バイト
for (int i = 0; i < encoded.length; i++) {
    encoded[i] = (byte)(longValue >> (8 * (longByteSize - (i + 1))));
}

結果を確認してみます。

for (byte b : encoded) {
    System.out.println(b & 0xff);
}

こちらも、元に戻っています。

0
0
0
0
7
91
205
21

Javaをやっていると、滅多にお目にかからないコードなので、せっかくなので試してみました。

ちなみに、NIOのByteBufferを使うともっと簡単です。
long→byte配列

ByteBuffer buf = ByteBuffer.allocate(8);
buf.putLong(123456789L);
for (byte b : buf.array()) {
    // バイト毎の処理
}

byte配列→long

byte[] bytes = {0, 0, 0, 0, (byte)7, (byte)91, (byte)205, (byte)21};  // 123456789L
ByteBuffer buf = ByteBuffer.wrap(bytes);
long longValue = buf.getLong();