關於base64編碼的原理和實現

2022-07-29 07:54:11 字數 2363 閱讀 9225

在前文 data uri 應用場景小結 中我們提到了乙個概念,叫做 base64編碼,今天我們就來聊聊 base64編碼,揭開它的神秘面紗。

一句話解釋:base64是一種基於64個可列印字元來表示二進位制資料的表示方法。

用記事本開啟exejpgpdf這些檔案時,我們都會看到一大堆亂碼,因為二進位制檔案包含很多無法顯示和列印的字元,所以,如果要讓記事本這樣的文字處理軟體能處理二進位制資料,就需要乙個二進位製到字串的轉換方法。base64 是一種最常見的二進位制編碼方法。

base64的原理很簡單,首先,準備乙個包含 64 個字元的陣列:

複製**['a', 'b', 'c', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']

附 base64 索引表:

然後,對二進位制資料進行處理,每 3 個位元組一組(如果位元組數不能被 3 整除,則用 0 補位),每個位元組是 8 bits,一共是3 x 8 = 24 bits,劃為 4 組,每組正好 6 個 bits。將每組的 6 bits 轉為十進位制數字,這樣我們得到 4 個數字作為索引(3->4,所以經過 base64 編碼的會比原檔案大 1/3,不過一般經過 gzip 壓縮後跟原檔案大小差不多),然後查表,獲得相應的 4 個字元,就是編碼後的字串。

如果是字串的 base64 編碼,具體步驟為:

獲取字串每個字元的 ascii 碼,如果字元數不能被 3 整除,則末尾補 0

將步驟 1 獲取的 ascii 碼轉為 8 位 二進位製碼

每 6 bits 為一組,並將 6 位二進位製碼轉為十進位制

對照上面的 base64 索引表,得到編碼後的字串

需要注意的是:

舉兩個例子:

(1)字元長度能被 3 整除時,比如 'han':

複製**h           a           n

ascii 104 97 110

8bit位元組 01101000 01100001 01101110

6bit位元組 011010 000110 000101 101110

十進位制 26 6 5 46

對應編碼 a g f u

(2)字元長度不能被 3 整除時,比如 'zichi':

複製**z           i           c           h          i

ascii: 122 105 99 104 105

8bit位元組: 01111010 01101001 01100011 01101000 01101001 00000000(補)

6bit位元組: 011110 100110 100101 100011 011010 000110 100100 000000

十進位制: 30 38 37 35 26 6 36 異常

對應編碼: e m l j a g k =

事實上,高階瀏覽器已經內建了atob(ascii to binary)以及btoa(binary to ascii)函式分別用來處理解碼和編碼 base64 字串。atob() 函式能夠解碼通過 base-64 編碼的字串資料。相反地,btoa() 函式能夠從二進位制資料「字串」建立乙個 base-64 編碼的 ascii 字串。(ps:特別要注意的是 btoa 是編碼,atob 是解碼 o(╯□╰)o)

不幸的是某些版本的 ie 瀏覽器並不支援 atob() 以及 btoa() 函式,好在理解了上述的編碼步驟,乙個 base64編碼、轉碼器也就不難實現了,可以猛戳 demo 進行檢視(html 部分 fork 了岑安大大的**,把 select 改成了 radio,個人覺得 radio 更方便)。**放在了 github。

BASE64 編碼原理

unit ubase64 編碼原理 將3個位元組轉換成4個位元組 3 x 8 24 4x6 先讀入3個位元組,每讀乙個位元組,左移8位,再右移四次,每次6位,這樣就有4個 位元組了。解碼原理 將4個位元組轉換成3個位元組,先讀入4個6位 用或運算 每次左 移6位,再右移3次,每次8位,這樣就還原了。...

Base64編碼原理

一 base64編碼原理 1 base64編碼原理簡單介紹 base64要求把每三個8bit的位元組轉換為四個6bit的位元組 3 8 4 6 24 然後把6bit再添兩位高位0,組成四個8bit的位元組,也就是說,轉換後的字串理論上將要比原來的長1 3。編碼原理如下所示 1 base64的編碼都是...

Base64編碼原理

所謂base64,就是說選出64個字元 小寫字母a z 大寫字母a z 數字0 9 符號 再加上作為墊字的 實際上是65個字元 作為乙個基本字符集。然後,其他所有符號都轉換成這個字符集中的字元。具體來說,轉換方式可以分為四步。第一步,將每三個位元組作為一組,一共是24個二進位制位。第二步,將這24個...