Javaにおけるbyte配列⇔16進数文字列の変換方法

投稿者 : OSCA

[PR] "東野・岡村の旅猿"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では、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 がリリースされている現在ではライブラリも進化していますので、このような処理を自作する必要はない事を覚えておきましょう。

Java環境構築へ戻る

Javaのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca