一、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圖片數據
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字符串與普通字符串互轉
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);