Apache Commons Codec で Base64 処理を行う (Java)

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では Apache Commons Codec で Base64 エンコード/デコード処理を行う方法について解説します。 Java で Base64 処理を行う際に、プロジェクトの特性に合わせてどのライブラリを利用するのが良いのかを、別稿「Java で Base64 エンコード/デコードを行う処理方法の選択について」で解説していますので、そちらも参考にして頂ければと思います。

Apache Commons Codec とは?

 Apache Commons Codec は、The Apache Software Foundation で開発されている Java 言語用ライブラリで、様々な種類のエンコード/デコードするクラスを含んだライブラリです。 今回の投稿の趣旨である Base64 の変換処理を行うクラスも含まれています。

Apache Commons Codec で Base64 処理を行う際の注意点

 Base64 の仕様は、用途によっていくつか定義されていますし変形版も存在します。 そのことはWikipedia の Base64 のページ が詳しいですが、最新の Apache Commons Codec は様々な Base64 の方式に対応しています。 少し前までの Apache Commons Codec では、適切な文字数ごとに改行を挿入する Base64 方式などに対応していなかったので、利用しようとしているバージョンの Apache Commons Codec が実装している機能の Base64 方式に対応しているのかを注意する必要があります。 できるなら一番最新の Apache Commons Codec を利用するのが良いでしょう。

Apache Commons Codec の導入

 Apache Commons Codec を利用するには、ダウンロードページからダウンロードするか、プロジェクトで Maven を利用している場合は依存関係に次のように追記すれば良いでしょう。

<dependency>
  <groupId>commons-codec</groupId>
  <artifactId>commons-codec</artifactId>
  <version>1.10</version>
</dependency>

サンプルプログラム (エンコード)

 それではさっそく Apache Commons Codec を利用してみましょう。 まずはエンコードのサンプルプログラムを示したいと思います。

// エンコード対象文字列 (変換前)
String target = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめも";

// 単純なBase64エンコード
byte[] encodedBytes = Base64.encodeBase64(target.getBytes());
System.out.println(new String(encodedBytes));

// 76文字ごとに改行するタイプのBase64エンコード
encodedBytes = Base64.encodeBase64Chunked(target.getBytes());
System.out.println(new String(encodedBytes));

// URLに含めても問題が発生しないようにするBase64エンコード
encodedBytes = Base64.encodeBase64URLSafe(target.getBytes());
System.out.println(new String(encodedBytes));

 上のサンプルプログラムの実行結果は次のようになります。

単純なBase64エンコード結果
44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX44GZ44Gb44Gd44Gf44Gh44Gk44Gm44Go44Gq44Gr44Gs44Gt44Gu44Gv44Gy44G144G444G744G+44G/44KA44KB44KC

76文字ごとに改行するタイプのBase64エンコード結果
44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX44GZ44Gb44Gd44Gf44Gh44Gk44Gm
44Go44Gq44Gr44Gs44Gt44Gu44Gv44Gy44G144G444G744G+44G/44KA44KB44KC

URLに含めても問題が発生しないようにするBase64エンコード結果
44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX44GZ44Gb44Gd44Gf44Gh44Gk44Gm44Go44Gq44Gr44Gs44Gt44Gu44Gv44Gy44G144G444G744G-44G_44KA44KB44KC

サンプルプログラム (デコード)

 次にデコードを試してみます。 エンコードの際には Base64 の形式に合わせていくつかのメソッドがありましたが、デコードについてはメソッドは decodeBase64 だけです。 どのような形式の Base64 データをデコードしようとしているかはメソッド内で自動的に判断してくれます。 よって次のサンプルプログラムでは一度エンコードした値を decodeBase64 でデコードして、元のデータに復元できます。

String target = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめも";
byte[] encodedBytes = Base64.encodeBase64Chunked(target.getBytes());
byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
System.out.println(new String(decodedBytes));

おわりに

 本稿では Apache Commons Codec による Base64 処理について解説しました。 エンコードする際には出力する Base64 形式に合ったメソッドを利用し、デコードの際には特にメソッドを使い分ける必要がない事を理解しておくと良いでしょう。

Java環境構築へ戻る

Javaのトップへ戻る

著者 : OSCA

OSCA

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