從base64到atob和btoa的一些理解

什麼是base64

Base64是網絡上最多見的用於傳輸8Bit字節碼的編碼方式之一,Base64就是一種基於64個可打印字符來表示二進制數據的方法。前端

爲何會有base64

因爲HTTP協議是文本協議,因此在HTTP協議下傳輸二進制數據須要將二進制數據轉換爲字符數據。然而直接轉換是不行的。由於網絡傳輸只能傳輸可打印字符。安全

問: 什麼是「可打印字符」呢?
答: 在ASCII碼中規定,0~3一、128這33個字符屬於控制字符,32~127這95個字符屬於可打印字符,也就是說網絡傳輸只能傳輸這95個字符,不在這個範圍內的字符沒法傳輸。網絡

問: 那麼該怎麼才能傳輸其餘字符呢?
答: 其中一種方式就是使用Base64。Base64通常用於在HTTP協議下傳輸二進制數據。編碼

base64實現原理

Base64的索引與對應字符的關係以下表所示:
圖片描述加密

也就是說,若是將索引轉換爲對應的二進制數據的話須要至多6個Bit(2^6=64)。然而ASCII碼須要8個Bit來表示,那麼怎麼使用6個Bit來表示8個Bit的數據呢?6個Bit固然不能存儲8個Bit的數據,可是4*6個Bit能夠存儲3*8個Bit的數據啊!spa

圖片描述

能夠看到「Son」經過Base64編碼轉換成了「U29u」。這是剛恰好的狀況,3個ASCII字符恰好轉換成對應的4個Base64字符。可是,當須要轉換的字符數不是3的倍數的狀況下該怎麼辦呢?Base64規定,當須要轉換的字符不是3的倍數時,一概採用補0的方式湊足3的倍數,具體以下表所示:code

圖片描述

每6個Bit爲一組,第一組轉換後爲字符「U」,第二組末尾補4個0轉換後爲字符「w」。剩下的使用「=」替代。即字符「S」經過Base64編碼後爲「Uw==」。這就是Base64的編碼過程。對象

HTML規範關於base64有哪些API

好了,原理懂了,那麼若是要進行base64編碼,咱們該怎麼作呢?本身擼一個方法?找一個庫?都行,可是HTML規範中已經規定了base64轉換的API,window對象上能夠訪問到base64編碼和解碼的方法,直接調用便可。
window.atob() // 對base64編碼過的字符串進行解碼
window.btoa() // 對ASCII編碼的字符串進行base64編碼(不支持漢字,漢字可經過URIencode預處理後再編碼)索引

base64有哪些應用場景

  1. 前端將較小的icon編碼爲base64直接在文檔中加載,減小http請求
  2. 電子郵件傳輸二進制文件時,一般用base64編碼後再傳

注意:圖片

  1. base64編碼後的數據量是要比編碼前大的,因此base64不能用於減小數據量。
  2. base64不能用於加密數據,即便使用私有的索引表也是不安全的。
相關文章
相關標籤/搜索