1.什麼是Base64?
百度百科中對Base64有一個很好的解釋:“Base64是網絡上最常見的用于傳輸8Bit位元組碼的編碼方式之一,Base64就是一種基于64個可列印字元來表示二進制資料的方法”。
什麼是“可列印字元”呢?為什麼要用它來傳輸8Bit位元組碼呢?在回答這兩個問題之前我們有必要來思考一下什麼情況下需要使用到Base64?Base64一般用于在HTTP協定下傳輸二進制資料,由于HTTP協定是文本協定,是以在HTTP協定下傳輸二進制資料需要将二進制資料轉換為字元資料。然而直接轉換是不行的。因為網絡傳輸隻能傳輸可列印字元。什麼是可列印字元?在ASCII碼中規定,0至31、127這33個字元屬于控制字元,32至126這95個字元屬于可列印字元,也就是說網絡傳輸隻能傳輸這95個字元,不在這個範圍内的字元無法傳輸。那麼該怎麼才能傳輸其他字元呢?其中一種方式就是使用Base64。
Base64,就是使用64個可列印字元來表示二進制資料的方法。Base64的索引與對應字元的關系如下表所示:

也就是說,如果将索引轉換為對應的二進制資料的話需要至多6個Bit。然而ASCII碼需要8個Bit來表示,那麼怎麼使用6個Bit來表示8個Bit的資料呢?6個Bit當然不能存儲8個Bit的資料,但是46個Bit可以存儲38個Bit的資料啊!如下表所示:
可以看到“Son”通過Base64編碼轉換成了“U29u”。這是剛剛好的情況,3個ASCII字元剛好轉換成對應的4個Base64字元。但是,當需要轉換的字元數不是3的倍數的情況下該怎麼辦呢?Base64規定,當需要轉換的字元不是3的倍數時,一律采用補0的方式湊足3的倍數,具體如下表所示:
每6個Bit為一組,第一組轉換後為字元“U”,第二組末尾補4個0轉換後為字元“w”。剩下的使用“=”替代。即字元“S”通過Base64編碼後為“Uw==”。這就是Base64的編碼過程。
2.Java中實作Base64
Java已經替我們寫好Base64的實作細節,使用的時候直接調用即可。具體代碼如下所示:
package com.first;
import org.junit.Test;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
public class Test {
@Test
public void test() throws UnsupportedEncodingException {
// 編碼
String encode = Base64.getEncoder().encodeToString("So".getBytes("UTF-8"));
System.out.println(encode);
// 解碼
byte[] decode = Base64.getDecoder().decode(encode);
System.out.println(new String(decode, "UTF-8"));
}
}