本稿では、Java 言語において「byte配列」と「16進数文字列」を相互に変換する方法について解説します。
方法を知ろう
byte配列と16進数文字列とを変換する方法はいくつかあります。
- Apache Commons Codec の Hex クラスを利用する
- DatatypeConverter クラスを利用する
筆者が最も利用するのは Apache Commons Codec の Hex クラスを利用する方法です。 逆に2015年ともなった今、最も参考にしない方が良い方法は、変換クラスの自作です。 インターネットで検索すると自作クラス(メソッド)を作成する方法が多く検索結果に現れますが、どれも古い記事で、上記のようなライブラリやクラスがある今では労力の無駄だと考えます。
Apache Commons Codec の Hex クラスを利用する
Apache Commons Codec は言わずと知れた The Apache Software Foundation が開発/配布する Java クラスライブラリです。 そのクラスライブラリの中に16進数(hexadecimal)を取り扱う為のクラス Hex があります。
Hex クラスで byte 配列を16進数文字列に変換する例を示します。 下のサンプルではバイトの配列を準備したり表示したりしていますが、実質の変換処理は1行で完結しています。
byte[] bytes = "あいうえお".getBytes();
String result = new String(Hex.encodeHex(bytes));
System.out.println(result);
逆に16進数文字列を byte 配列に変換することも簡単です。 次のサンプルプログラムのように実装します。
String hexString = "e38182e38184e38186e38188e3818a";
byte[] bytes = Hex.decodeHex(hexString.toCharArray());
System.out.println(new String(bytes));
このように、Apache Commons Codec を利用すると簡単に byte配列⇔16進数文字列 の変換を行うことができます。
DatatypeConverter クラスを利用する
もうひとつの方法として DatatypeConverter クラスを使う方法があります。 このクラスは標準の Java に含まれているので、新たにプロジェクトにライブラリを追加する必要はありません。 但し(これは個々人の好みだとは思いますが)、DatatypeConverter クラスが属するのが javax.xml.bind パッケージであり、XML関連クラスである位置づけなので、本来の用途として合っていないのではないかと思うと、筆者は少し気持ち悪く感じてしまいます。 それでも、ここで行いたい変換は簡単に実現することができます。 まずは byte 配列から16進数文字列を得るサンプル。
byte[] bytes = "あいうえお".getBytes();
String hexString = DatatypeConverter.printHexBinary(bytes);
System.out.println(hexString);
逆に16進数文字列を byte 配列に変換することも簡単です。 次のサンプルプログラムのように実装します。
String hexString = "E38182E38184E38186E38188E3818A";
byte[] bytes = DatatypeConverter.parseHexBinary(hexString);
System.out.println(new String(bytes));
このように簡単に変換を行うことができます。
おわりに
本稿ではbyte配列と16進数文字列を相互に変換する方法について解説しました。 繰り返しになりますが、Java 8 がリリースされている現在ではライブラリも進化していますので、このような処理を自作する必要はない事を覚えておきましょう。