Base64前世今生

一、背景

       早期的一些傳輸協議,例如傳輸郵件的SMTP協議,只能傳輸可打印的ASCII字符(ASCII碼的範圍是0~127)。導致原本8Bit字節碼(範圍是0~255)超出了可用範圍。

       例如:當郵件傳輸圖片資源的時候,某一個Byte是10111100B,對應的十進制數是188,不在ASCII碼的範圍內,因此無法被傳輸。此時,Base64編碼應運而生,它利用6bit字符表示了原本的8bit字符,可以把ASCII碼範圍之外的字符轉換成可打印的6bit字符。

二、Base64編碼

2.1、名稱由來

Base64 是一種編碼算法,爲什麼叫Base64呢?因爲它只支持64個可打印字符,Base64編碼表如下圖所示;

2.2、爲什麼是64?

ASCII碼的範圍是0~127,其中0~31和127這33 個字符屬於控制字符,剩下的95個字符屬於可打印字符,包含數組、字母大小寫、常用符號。

64是2的6次方,n個二進制數被6位6位的等分。

如果選擇7等分:2^7=128,沒有那麼多的可打印字符;如果選擇5等分:2^=32,這樣的話會有很多字符資源未使用,浪費資源。

2.3、原理

Base64是如何編碼與解碼的呢?

編碼:

1)把:待轉換的數據每三個字節分爲一組,每個字節是8bit,那麼3個字節一共就是24bit

2)將得到的24bit再每6bit一組,一共得到4組數據

3)在每組前加00,得到4個8bit數據

4)根據Base64編碼表獲得數據

問題1:如果待轉換的數據不是3的整數倍怎麼辦?

答:多於的8bit中,前6bit作爲一個Base64字符,剩下的2bit最爲第二個Base64字符的前兩位,後0補齊即可。至於第三第四個Base64字符,沒有匹配的8bit字符,那麼就使用"="字符填充。如下圖所示:

發現:Base64字符表中的字符原本用6個bit就可以表示,現在前面添加2個0,變爲8個bit,會造成一定的空間浪費。因此,Base64編碼之後的文本,要比原數據長大約三分之一。

解碼:

解碼也是同樣的道理。

補充:Base64只是編碼算法,並不是加密算法,任何人都可以將Base64編碼的結果解碼成唯一的原數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章