1. 程式人生 > >base64 原理

base64 原理

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值丟棄,因為它們實際上不攜帶有效資訊。

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值丟棄,因為它們實際上不攜帶有效資訊。