Base64原理解析


   一. Base64編碼由來

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

  二.Base的索引表

  看一下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對於的編碼, 以下為具體的解析過程案例:

  把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圖片數據
復制代碼

  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

作者: NONO
出處:http://www.cnblogs.com/diligenceday/
企業網站:http://www.idrwl.com/
開源博客:http://www.github.com/sqqihao
QQ:287101329
微信:18101055830 


免責聲明!

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



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