Base64は、限られた文字列しか扱うことしかできない通信環境においてマルチバイト文字やバイナリデータを扱うために、データを64種類の英数字のみに置き換えるエンコード方式です。本稿では、JavaでBase64エンコード/デコードを実装する方法を解説します。
実装方法
Java8では標準クラスライブラリにBase64用のクラスが追加されたため、ライブラリを追加することなく処理を実装することができるようになりました。しかしJava7以前では標準ライブラリにBase64を扱うクラスがありませんでしたので、Apache Commons Codec などのライブラリを別途追加する必要があります。
現在の主流は少なくともJava8以降ですので、標準クラスライブラリを使用した実装方法をメインに解説します。
Java8以降の実装方法
エンコード
java.util.Base64
のEncoder
クラスを利用してエンコードを行います。Base64.getEncoder()
で取得したインスタンスのencodeToString()
を実行する際に、エンコード対象の文字列のbyte配列を渡してください。
package net.develman.convert;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64Encode {
public static final void main(String[] args){
//エンコード対象の文字列
String source = "あいうえお";
//エンコード対象の文字列をbyte配列にする際に、以下の文字コードの文字列とみなす
Charset charset = StandardCharsets.UTF_8;
//エンコード実行
String result = Base64.getEncoder().encodeToString(source.getBytes(charset));
System.out.println("エンコード結果:" + result);
}
}
実行結果
エンコード結果:44GC44GE44GG44GI44GK
デコード
エンコードと同じく、java.util.Base64
のEncoder
クラスを利用してデコードを行います。Base64.getDecoder()
で取得したインスタンスのdecode()
を実行する際に、デコード対象の文字列を渡してください。戻り値はデコード後のbyte配列になります。String型に戻す際は、文字コードはエンコード時と同じものを指定してください。
package net.develman.convert;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64Decode {
public static final void main(String[] args){
//デコード対象の文字列
String source = "44GC44GE44GG44GI44GK";
//デコードしたbyte配列を文字列に置き換える際に使用する文字コード(エンコード時と同じものを指定する)
Charset charset = StandardCharsets.UTF_8;
//デコード実行
byte[] decoded = Base64.getDecoder().decode(source);
String result = new String(decoded, charset);
System.out.println("デコード結果:" + result);
}
}
実行結果
デコード結果:あいうえお
Java7以前の実装方法
Apache Commons Codec を使用した例
Apache Commons Codec のライブラリをクラスパスに追加します。ただしBase64の仕様に対応できていない時期のものもありますので、できれば最新のバージョンを仕様してください。
下はMavenを使用した依存関係の定義例です。プロジェクト管理ツールを使用しない場合はこちらからjarをダウンロードしてプロジェクトに追加してください。
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
サンプルコード
package net.develman.convert_jre7;
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class Base64Encode {
public static final void main(String[] args) {
//エンコード対象の文字列
String source = "あいうえお";
//エンコード対象の文字列をbyte配列にする際に、以下の文字コードの文字列とみなす
Charset charset = StandardCharsets.UTF_8;
System.out.println("元の文字列 :" + source);
//エンコード実行
byte[] enc = Base64.encodeBase64(source.getBytes(charset));
System.out.println("エンコード結果:" + new String(enc, charset));
//デコード実行
byte[] dec = Base64.decodeBase64(enc);
System.out.println("デコード結果 :" + new String(dec, charset));
}
}
実行結果
元の文字列 :あいうえお エンコード結果:44GC44GE44GG44GI44GK デコード結果 :あいうえお
注意
URLにBase64文字列を含むような場合、「+」や「/」が予期せぬ挙動を引き起こす場合がありますので、これらの文字をエスケープしてURLセーフな形式としなければないので注意が必要です。Base64から派生した形式についてこちらを参照ください。