Java標準のBase64クラスでエンコードとデコードを行うサンプルです。
(確認環境:Java 8)
目次
説明 | Base64クラス |
サンプル | 1.「基本」のサンプル |
2.「URLおよびファイル名で安全」のサンプル | |
3.「MIME」のサンプル | |
表 | RFC4648の表1のBase64アルファベット |
RFC2045の表1のBase64アルファベット | |
RFC4648の表2のBase64アルファベット |
Base64クラス
public class Base64 extends Object |
- Base64クラスのメソッドでエンコード(テキスト形式→バイナリ形式)/デコード(バイナリ形式→テキスト形式)します。
- Base64は、64種類の英数字を使用します。通信などで使われます。
・アルファベット(a-z)の26文字と(A-Z)の26文字で52文字
・数字(0-9)の10文字
・記号の+と/の2文字
→52+10+2=64文字
※上記に加えてパディングとして=も使用します。 - Base64クラスは、次の3つのBase64をサポートしています。
「基本」
「URLおよびファイル名で安全」
「MIME」 - Java8で標準機能として追加されました。
- 以下はJava8 API仕様のBase64クラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Base64.html
1.「基本」のサンプル
public static Base64.Encoder getEncoder() |
public static Base64.Decoder getDecoder() |
- getEncoderメソッドとgetDecoderメソッドを使用します。
- RFC4648の表1およびRFC2045の表1の「Base64アルファベット」を使用します。
変換後の文字でプラス(+)とスラッシュ(/)を使います。(「URLおよびファイル名で安全」との違い)。URLの場合、プラス(+)とスラッシュ(/)が意味を持ってしまいます。 - 改行されません。(「MIME」との違い)
- デコーダは、base64アルファベットの範囲外の文字を含むデータを拒否します。
package test1;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Test1 {
public static void main(String[] args) {
Charset charset = StandardCharsets.UTF_8;
String moji ="PHP コミュニティ 会社1";
// エンコード
byte[]a = Base64.getEncoder()
.encode(moji.getBytes(charset));
String en1 = new String(a, charset);
System.out.println(en1);
// UEhQICDjgrPjg5/jg6Xjg4vjg4bjgqMg5Lya56S+MQ==
// デコード
byte[]b = Base64.getDecoder().decode(a);
String de1 = new String(b,charset);
System.out.println(de1);
//PHP コミュニティ 会社1
}
}
13,14行目は、文字列をバイト配列にしてBase64でエンコードしています。
注目は、17行目で変換後の文字列にスラッシュ(/)とプラス(+)があります。
URLの場合、スラッシュ(/)とプラス(+)が意味を持ってしまいます。
17行目のイコール(=)は、パディングです。余った部分を詰めています。
20行目は復号してバイト配列にし文字列にしています。
以下はバイト配列の作成と復号のリンクです。
Java バイト配列の作成と復号のサンプル
2.「URLおよびファイル名で安全」のサンプル
public static Base64.Encoder getUrlEncoder() |
public static Base64.Decoder getUrlDecoder() |
- getUrlEncoderメソッドとgetUrlDecoderメソッドを使用します。
- RFC4648の表2の「URLおよびファイル名で安全なBase64アルファベット」を使用します。
変換後の文字でプラス(+)とスラッシュ(/)を使用しません。マイナス(-)とアンダスコア(_)に変換します。URLの場合でも、スラッシュ(/)とプラス(+)と違い意味を持ちません。=は削除します。 - 改行されません。(「MIME」との違い)
- デコーダは、base64アルファベットの範囲外の文字を含むデータを拒否します。
package test1;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Test1 {
public static void main(String[] args) {
Charset charset = StandardCharsets.UTF_8;
String moji ="PHP コミュニティ 会社1";
// エンコード
byte[]a = Base64.getUrlEncoder().withoutPadding()
.encode(moji.getBytes(charset));
String en1 = new String(a, charset);
System.out.println(en1);
// UEhQICDjgrPjg5_jg6Xjg4vjg4bjgqMg5Lya56S-MQ
// デコード
byte[]b = Base64.getUrlDecoder().decode(a);
String de1 = new String(b,charset);
System.out.println(de1);
//PHP コミュニティ 会社1
}
}
13,14行目は、文字列をバイト配列にしてBase64でエンコードしています。
注目は、17行目で変換後の文字列にスラッシュ(/)とプラス(+)ではなくマイナス(-)とアンダスコア(_)に変換されています。 URLでも、スラッシュ(/)とプラス(+)と違い意味を持ちません。
17行目は、末尾のイコール(=)がありません。13行目のwithoutPaddingで実現しています。
20行目は復号してバイト配列にし文字列にしています。
以下はバイト配列の作成と復号のリンクです。
Java バイト配列の作成と復号のサンプル
3.「MIME」のサンプル
public static Base64.Encoder getMimeEncoder(int lineLength,byte[] lineSeparator) |
public static Base64.Decoder getMimeDecoder() |
- getMimeEncoderメソッドとgetMimeDecoderメソッドを使用します。
- RFC2045の表1の「Base64アルファベット」を使用します。
- 改行されます。それぞれが76文字以下で、キャリッジ・リターン「\r」の直後に改行「\n」を続けたものが行区切り文字となります。(「基本」と「URLおよびファイル名で安全」との違い)
- デコーダは、base64アルファベット表で見つからない行区切り文字またはその他の文字はすべて無視します。
package test1;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Test1 {
public static void main(String[] args) {
Charset charset = StandardCharsets.UTF_8;
String moji ="PHP コミュニティ 会社1,PHP コミュニティ 会社1";
// エンコード
byte[]a = Base64.getMimeEncoder()
.encode(moji.getBytes(charset));
String en1 = new String(a, charset);
System.out.println(en1);
//UEhQICDjgrPjg5/jg6Xjg4vjg4bjgqMg5Lya56S+MSxQSFAgIOOCs+ODn+ODpeODi+ODhuOCoyDk
//vJrnpL4
// デコード
byte[]b = Base64.getMimeDecoder().decode(a);
String de1 = new String(b,charset);
System.out.println(de1);
//PHP コミュニティ 会社1,PHP コミュニティ 会社1
}
}
13,14行目は、文字列をバイト配列にしてBase64でエンコードしています。
16行目は、76文字目の後で改行されます。上記エンコードとの違いです。
21行目は復号してバイト配列にし文字列にしています。
RFC4648の表1のBase64アルファベット
RFC4648の表1のBase64アルファベットです。この下にあるRFC2045の表1と同じです。
イコール(=)は、パディング(padding)です。余った部分を詰めます。
https://tools.ietf.org/html/rfc4648
Table 1: The Base 64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y
RFC2045の表1のBase64アルファベット
RFC2045の表1のBase64アルファベットです。この上にあるRFC4648の表1と同じです。
イコール(=)は、パディング(padding)です。余った部分を詰めます。
https://www.ietf.org/rfc/rfc2045.txt
Table 1: The Base64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y
RFC4648の表2のBase64アルファベット
RFC4648の表2のBase64アルファベットです。
上記2つの表との違いは,62と63です。プラス(+)とスラッシュ(/)がマイナス(-)とアンダーライン(_)になっています。
イコール(=)は、パディング(padding)です。余った部分を詰めます。
https://tools.ietf.org/html/rfc4648
Table 2: The "URL and Filename safe" Base 64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 - (minus) 12 M 29 d 46 u 63 _ 13 N 30 e 47 v (underline) 14 O 31 f 48 w 15 P 32 g 49 x 16 Q 33 h 50 y (pad) =
関連の記事