Base64編碼之所以稱為Base64,是因為其使用64個字符來對任意數據進行編碼,同理有Base32、Base16編碼。標准Base64編碼使用的64個字符為:

這64個字符是各種字符編碼(比如ASCII碼)所使用字符的子集,並可打印。唯一有點特殊的是最后兩個字符。
Base64本質上是一種將二進制數據轉成文本數據的方案。對於非二進制數據,是先將其轉換成二進制形式,然后每連續6比特(2的6次方=64)計算其十進制值,根據該值在上面的索引表中找到對應的字符,最終得到一個文本字符串。假設我們對Hello!進行Base64編碼,按照ASCII表,其轉換過程如下圖所示:

可知Hello!的Base64編碼結果為SGVsbG8h,原始字符串長度為6個字符串,編碼后長度為8個字符,每3個原始字符經編碼成4個字符。
但要注意,Base64編碼是每3個原始字符編碼成4個字符,如果原始字符串長度不能被3整除,怎么辦?使用0來補充原始字符串。
以Hello!!為例,其轉換過程為:

Hello!! Base64編碼的結果為 SGVsbG8hIQAA 。最后2個零值只是為了Base64編碼而補充的,在原始字符中並沒有對應的字符,那么Base64編碼結果中的最后兩個字符 AA 實際不帶有效信息,所以需要特殊處理,以免解碼錯誤。
標准Base64編碼通常用 = 字符來替換最后的 A,即編碼結果為 SGVsbG8hIQ==。因為 = 字符並不在Base64編碼索引表中,其意義在於結束符號,在Base64解碼時遇到 = 時即可知道一個Base64編碼字符串結束。
如果Base64編碼字符串不會相互拼接再傳輸,那么最后的 = 也可以省略,解碼時如果發現Base64編碼字符串長度不能被4整除,則先補充 = 字符,再解碼即可。
解碼是對編碼的逆向操作,但注意一點:對於最后的兩個 = 字符,轉換成兩個A 字符,再轉成對應的兩個6比特二進制0值,接着轉成原始字符之前,需要將最后的兩個6比特二進制0值丟棄,因為它們實際上不攜帶有效信息。
