追記)
最後に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();