Base64原理解析

shh_1014 8年前發布 | 7K 次閱讀 CSS JavaScript

一. Base64編碼由來

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

二.Base的索引表

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

三.Base64的原理

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

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

如果是字符串轉換為Base64碼, 會先把對應的字符串轉換為ascll碼表對應的數字, 然后再把數字轉換為2進制, 比如a的ascll碼味97, 97的二進制是:01100001, 把8個二進制提取成6個,剩下的2個二進制和后面的二進制繼續拼接, 最后再把6個二進制碼轉換為Base64對于的編碼, 以下為具體的解析過程案例:

abc 這三個字符轉換為Base64的過程

字符串      a       b        c
ASCII      97      98       99
8bit字節   01100001 01100010 01100011
6bit字節   011000   010110   001001   100011
十進制      24      22        9        35
對應編碼    Y        W        J        j

man 這三個字符轉換為Base64的過程

字符串    m         a        n
ASCII    109       97       110
8bit字節  01101101 01100001 01101110
6bit字節  011011   010110   000101     101110
十進制     27       22       5         46
對應編碼   b        W        F          u

現在還有一點小問題,當轉換到最后, 最后的字符不足3個字符咋辦, 如果不足三個字符的話,我們直接在最后添加=號即可, 具體可以參考以下兩個字符串轉換案例:

目前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圖片數據

</pre>

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

 

來自:http://www.cnblogs.com/diligenceday/p/6002382.html

 

 本文由用戶 shh_1014 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!