Java Base64 Encode and Decode

Java Base64 Encode and Decode – Java 147

Java Base64 Encode and Decode

在 Java 8 現在具有用於 Base64 編碼的內建編碼器和解碼器,總共有三種編碼器,基本、 MIME 和 URL 編碼器,將二進位資料可視化,也常用來表示資料加密過後的內容,以便透過網路傳輸,不會損壞且不會遺失任何資料,接收端再將文字轉換為二進位資料, Base64 Encode and Decode in Java 本篇增加了範例,並透過單元測試來驗證產出結果。

基本編碼器

輸出映射到一組字元 A-Za-z0-9+/ ,不添加任何行分隔符號,輸出編碼字串的長度必須是四的倍數,若不足夠,會根據需要在輸出末尾添加一兩個填充字元 (=) 。

MIME 編碼器

輸出映射到一組字元 A-Za-z0-9+/ ,是一種將非 ASCII 資料傳輸到電子郵件伺服器的規格,與 Base64 編碼類似,如果編碼的資料超過 76 個字元,則會資料將拆分為多行,每行最多包含 76 個字元,添加行分隔符號 \r\n ,輸出末尾不存在行分隔符號。

URL 編碼器

輸出映射到一組字元 A-Za-z0-9_- ,與基本編碼器相同,唯一的區別是對 URL 和檔案名稱安全,字元 + 換成 _ ,及字元 / 換成 – ,不添加任何行分隔符號,輸出編碼字串的長度必須是四的倍數,若不足夠,會根據需要在輸出末尾添加一兩個填充字元 (=) 。

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- base64
       |                   +- Base64EncodeDecodeTest.java   

單元測試

Java Base64 Encoder Decoder 提供 Base64 編碼器操作,將位元組編碼成 Base64 ,並將 Base64 字串解碼為普通字串。

encode

建立一個 String ,轉成 byte[] ,使用 Base64.Encoder 進行編碼。

	@Test
	public void encode() throws Exception {
		Base64.Encoder encoder = Base64.getEncoder();
		String value = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
		System.out.println(value);
		byte[] result = encoder.encode(value.getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result))
				.isEqualTo("QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXw==");
	}
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_
[B@6aa8ceb6
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXw==

decode

Java Base64 Encoder Decoder 建立一個 String ,轉成 byte[] ,使用 Base64.Decoder 進行解碼。

	@Test
	public void decode() throws Exception {
		Base64.Decoder decoder = Base64.getDecoder();
		String value = "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXw==";
		System.out.println(value);
		byte[] result = decoder.decode(value.getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result)).isEqualTo("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
	}
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXw==
[B@6aa8ceb6
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

mimeEncode

Java Base64 Encoder Decoder 建立一個 String ,轉成 byte[] ,使用 Base64.MimeEncoder 進行編碼。

	@Test
	public void mimeEncode() throws Exception {
		Base64.Encoder encoder = Base64.getMimeEncoder();
		StringBuilder value = new StringBuilder();
		value.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
		System.out.println(value);
		byte[] result = encoder.encode(value.toString().getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result)).containsIgnoringNewLines(
				"QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0\n" + "NTY3ODktXw==");
	}
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_
[B@6aa8ceb6
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0
NTY3ODktXw==

mimeDecode

Java Base64 Encoder Decoder 建立一個 String ,轉成 byte[] ,使用 Base64.MimeDecoder 進行解碼。

	@Test
	public void mimeDecode() throws Exception {
		Base64.Decoder decoder = Base64.getMimeDecoder();
		String value = "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0\n"
				+ "NTY3ODktXw==";
		System.out.println(value);
		byte[] result = decoder.decode(value.toString().getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result)).isEqualTo("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
	}
QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0
NTY3ODktXw==
[B@6aa8ceb6
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_

urlEncode

Base64 Encoder Decoder in Java 建立一個 String ,轉成 byte[] ,使用 Base64.UrlDecoder 進行解碼。

	@Test
	public void urlEncode() throws Exception {
		Base64.Encoder encoder = Base64.getUrlEncoder();
		String value = "https://www.ruoxue.org/category/rd/java/java-base64/";
		System.out.println(value);
		byte[] result = encoder.encode(value.getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result))
				.isEqualTo("aHR0cHM6Ly93d3cucnVveHVlLm9yZy9jYXRlZ29yeS9yZC9qYXZhL2phdmEtYmFzZTY0Lw==");
	}
https://www.ruoxue.org/category/rd/java/java-base64/
[B@6aa8ceb6
aHR0cHM6Ly93d3cucnVveHVlLm9yZy9jYXRlZ29yeS9yZC9qYXZhL2phdmEtYmFzZTY0Lw==

urlDecode

Base64 Encoder Decoder in Java 建立一個 String ,轉成 byte[] ,使用 Base64.UrlDecoder 進行解碼。

	@Test
	public void urlDecode() throws Exception {
		Base64.Decoder decoder = Base64.getUrlDecoder();
		String value = "aHR0cHM6Ly93d3cucnVveHVlLm9yZy9jYXRlZ29yeS9yZC9qYXZhL2phdmEtYmFzZTY0Lw==";
		System.out.println(value);
		byte[] result = decoder.decode(value.getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result)).isEqualTo("https://www.ruoxue.org/category/rd/java/java-base64/");
	}
aHR0cHM6Ly93d3cucnVveHVlLm9yZy9jYXRlZ29yeS9yZC9qYXZhL2phdmEtYmFzZTY0Lw==
[B@6aa8ceb6
https://www.ruoxue.org/category/rd/java/java-base64/

Base64EncodeDecodeTest.java

Base64 Encoder Decoder in Java 新增單元測試,驗證 Java Base64 Encode Decode 是否符合預期。

package org.ruoxue.java_147.base64;

import static org.assertj.core.api.Assertions.assertThat;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

import org.junit.Test;

public class Base64EncodeDecodeTest {

	@Test
	public void encode() throws Exception {
		Base64.Encoder encoder = Base64.getEncoder();
		String value = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
		System.out.println(value);
		byte[] result = encoder.encode(value.getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result))
				.isEqualTo("QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXw==");
	}

	@Test
	public void decode() throws Exception {
		Base64.Decoder decoder = Base64.getDecoder();
		String value = "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXw==";
		System.out.println(value);
		byte[] result = decoder.decode(value.getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result)).isEqualTo("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
	}

	@Test
	public void mimeEncode() throws Exception {
		Base64.Encoder encoder = Base64.getMimeEncoder();
		StringBuilder value = new StringBuilder();
		value.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
		System.out.println(value);
		byte[] result = encoder.encode(value.toString().getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result)).containsIgnoringNewLines(
				"QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0\n" + "NTY3ODktXw==");
	}

	@Test
	public void mimeDecode() throws Exception {
		Base64.Decoder decoder = Base64.getMimeDecoder();
		String value = "QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0\n"
				+ "NTY3ODktXw==";
		System.out.println(value);
		byte[] result = decoder.decode(value.toString().getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result)).isEqualTo("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
	}

	@Test
	public void urlEncode() throws Exception {
		Base64.Encoder encoder = Base64.getUrlEncoder();
		String value = "https://www.ruoxue.org/category/rd/java/java-base64/";
		System.out.println(value);
		byte[] result = encoder.encode(value.getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result))
				.isEqualTo("aHR0cHM6Ly93d3cucnVveHVlLm9yZy9jYXRlZ29yeS9yZC9qYXZhL2phdmEtYmFzZTY0Lw==");
	}

	@Test
	public void urlDecode() throws Exception {
		Base64.Decoder decoder = Base64.getUrlDecoder();
		String value = "aHR0cHM6Ly93d3cucnVveHVlLm9yZy9jYXRlZ29yeS9yZC9qYXZhL2phdmEtYmFzZTY0Lw==";
		System.out.println(value);
		byte[] result = decoder.decode(value.getBytes(StandardCharsets.UTF_8.toString()));
		System.out.println(result);
		System.out.println(new String(result));
		assertThat(new String(result)).isEqualTo("https://www.ruoxue.org/category/rd/java/java-base64/");
	}
}

心得分享

Java Base64 Encode Decode 依照 RFC 4648 、 RFC 2045 中指定的 Base64 字母表,用 64 種字元組合成字串,將二進位資料轉換為文字格式,Base64 已經成為 Java 類別函式庫的標準,熟悉 Base64 Encoder Decoder in Java 工具類別提供的靜態方法,取得基本編碼器,進行編碼解碼的操作。

發佈留言