Base64原理解析與使用

1、Base64編碼由來

  爲何會有Base64編碼呢?由於有些網絡傳送渠道並不支持全部的字節,例如傳統的郵件只支持可見字符的傳送,像ASCII碼的控制字符就 不能經過郵件傳送。這樣用途就受到了很大的限制,好比圖片二進制流的每一個字節不可能所有是可見字符,因此就傳送不了。最好的方法就是在不改變傳統協議的情 況下,作一種擴展方案來支持二進制文件的傳送。把不可打印的字符也能用可打印字符來表示,問題就解決了。Base64編碼應運而生,Base64就是一種 基於64個可打印字符來表示二進制數據的表示方法javascript

2、Base64的索引表

  看一下Base64的索引表,字符選用了"A-Z、a-z、0-九、+、/" 64個可打印字符。數值表明字符的索引,這個是標準Base64協議規定的,不能更改。css

3、Base64的原理

  Base64的碼錶只有64個字符, 若是要表達64個字符的話,使用6的bit便可徹底表示(2的6次方爲64)。html

  由於Base64的編碼只有6個bit便可表示,而正常的字符是使用8個bit表示, 8和6的最小公倍數是24,因此4個Base64字符能夠表示3個標準的ascll字符;java

  若是是字符串轉換爲Base64碼, 會先把對應的字符串轉換爲ascll碼錶對應的數字, 而後再把數字轉換爲2進制, 好比a的ascll碼味97, 97的二進制是:01100001, 把8個二進制提取成6個,剩下的2個二進制和後面的二進制繼續拼接, 最後再把6個二進制碼轉換爲Base64對於的編碼, 如下爲具體的解析過程案例:瀏覽器

假設咱們要對 Hello! 進行Base64編碼,按照ASCII表,其轉換過程以下圖所示:網絡

可知 Hello! 的Base64編碼結果爲 SGVsbG8h ,原始字符串長度爲6個字符,編碼後長度爲8個字符,每3個原始字符經Base64編碼成4個字符,編碼先後長度比4/3,這個長度比很重要 - 比原始字符串長度短,則須要使用更大的編碼字符集,這並不咱們想要的;長度比越大,則須要傳輸越多的字符,傳輸時間越長。Base64應用普遍的緣由是在字符集大小與長度比之間取得一個較好的平衡,適用於各類場景。ide

是否是以爲Base64編碼原理很簡單?ui

但這裏須要注意一個點:Base64編碼是每3個原始字符編碼成4個字符,若是原始字符串長度不能被3整除,那怎麼辦?使用0值來補充原始字符串。編碼

以 Hello!! 爲例,其轉換過程爲:spa

注:圖表中藍色背景的二進制0值是額外補充的。

Hello!! Base64編碼的結果爲 SGVsbG8hIQAA 。最後2個零值只是爲了Base64編碼而補充的,在原始字符中並無對應的字符,那麼Base64編碼結果中的最後兩個字符 AA 實際不帶有效信息,因此須要特殊處理,以避免解碼錯誤。

標準Base64編碼一般用 = 字符來替換最後的 A,即編碼結果爲 SGVsbG8hIQ==。由於 = 字符並不在Base64編碼索引表中,其意義在於結束符號,在Base64解碼時遇到 = 時便可知道一個Base64編碼字符串結束。

若是Base64編碼字符串不會相互拼接再傳輸,那麼最後的 = 也能夠省略,解碼時若是發現Base64編碼字符串長度不能被4整除,則先補充 = 字符,再解碼便可。

解碼是對編碼的逆向操做,但注意一點:對於最後的兩個 = 字符,轉換成兩個 A 字符,再轉成對應的兩個6比特二進制0值,接着轉成原始字符以前,須要將最後的兩個6比特二進制0值丟棄,由於它們實際上不攜帶有效信息。

目前Data URI 支持不少中類型:

目前,Data URI scheme支持的類型有:
  data:,文本數據
  data:text/plain,文本數據
  data:text/html,HTML代碼
  data:text/html;base64,base64編碼的HTML代碼
  data:text/css,CSS代碼
  data:text/css;base64,base64編碼的CSS代碼
  data:text/javascript,Javascript代碼
  data:text/javascript;base64,base64編碼的Javascript代碼
  data:image/gif;base64,base64編碼的gif圖片數據
  data:image/png;base64,base64編碼的png圖片數據
  data:image/jpeg;base64,base64編碼的jpeg圖片數據
  data:image/x-icon;base64,base64編碼的icon圖片數據
View Code

base64簡單地說,它把一些 8-bit 數據翻譯成標準 ASCII 字符,目前,IE八、Firfox、Chrome、Opera瀏覽器都支持這種小文件嵌入。

參考:

base64的編碼原理:http://www.cnblogs.com/hongru/archive/2012/01/14/2321397.html

base64字節碼原理:http://www.cnblogs.com/chengxiaohui/articles/3951129.html

Base64編碼原理與應用

4、base64字符串與普通字符串互轉

  C#實例

//轉成 Base64 形式的 System.String:
    string a = "base64字符串與普通字符串互轉";  
    byte[] b = System.Text.Encoding.Default.GetBytes(a);      
    //轉成 Base64 形式的 System.String  
    a = Convert.ToBase64String(b);  
    Response.Write(a);  
 
//轉回到原來的 System.String:
    byte[] c = Convert.FromBase64String(a);  
    a = System.Text.Encoding.Default.GetString(c);  
    Response.Write(a);  
View Code
相關文章
相關標籤/搜索