Base64原理解析與使用


一、Base64編碼由來

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

二、Base64的索引表

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

三、Base64的原理

  Base64的碼表只有64個字符, 如果要表達64個字符的話,使用6個bit即可完全表示(2的6次方為64)。

  因為Base64的編碼只有6個bit即可表示,而正常的字符是使用8個bit表示, 8和6的最小公倍數是24,所以4個Base64字符可以表示3個標准的ascll字符;

  如果是字符串轉換為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應用廣泛的原因是在字符集大小與長度比之間取得一個較好的平衡,適用於各種場景。

是不是覺得Base64編碼原理很簡單?

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

以 Hello!! 為例,其轉換過程為:

注:圖表中藍色背景的二進制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 字符,目前,IE8、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編碼原理與應用

四、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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM