爲什麼是base64編碼,而不是base32、base16、base63?

	Base64一般用於在HTTP協議下傳輸二進制數據,由於HTTP協議是文本協議,所以在HTTP協議下傳輸二進制數據需要將二進制數據轉換爲
	字符數據。然而直接轉換是不行的。因爲網絡傳輸只能傳輸可打印字符。什麼是可打印字符?在ASCII碼中規定,0~31、127這33個字符屬
	於控制字符,32~126這95個字符屬於可打印字符,也就是說網絡傳輸只能傳輸這95個字符,不在這個範圍內的字符無法傳輸。

基於上述文字,下面是我對base64編碼的分析理解

(注:以下只考慮base64涉及的編碼解碼過程,中間過程不予探討)

  • 目的:HTTP是文本協議,我們需要用字符串來表示二進制數據以便HTTP協議解析傳輸,並且滿足傳輸前後數據一致。
  • 約束:傳輸的字符受限(95個),所以必須使用這95個字符以內的數據來表示二進制數據。
  • 思路:尋找一種合適的編碼解碼方案。
    例如:
    編碼(encode)時,將二進制數據 '01 編碼成字符 ‘a’。
    解碼(decode)時,將字符串 ‘a’ 解碼成二進制數據 ‘01’。

條件推導:

  • 爲了編碼解碼的正確性,我們必須保證二進制單位數據和編碼字符的一一映射。
  • 由於任意字符類型數量,我們都可以縮小/擴大二進制數據編碼單位來與之對應,而字符數量被約束在95個之下,所以我們只能縮小二進制數據編碼單位來減小字符串種類來保證一一映射關係。

由此我們必須縮小二進制數據編碼單位至95或以下,且因爲二進制數據由0/1組成,其編碼單位只能是2的指數,所以我們只能選擇七位(26 < 95 < 27)以下二進制數據來作爲二進制數據編碼單位,也就是6/5/4/3/2/1位二進制來和26/25/24/23/22/21種字符來進行一一映射。

也就是說,我們必須選擇[1,6]以內的二進制位數,如果我們選擇每1位二進制都編碼成一個字符,那麼編碼結果只有二種字符類型,編碼解碼效率相當快。但是每個字節就會被編碼成八個字符,加大了傳輸量。爲了減少傳輸量,我們選擇每6位編碼成一個字符,那麼編碼結果就有64種字符類型,每個字節使用1.33~個字符表示,每3個字節使用4個字符表示,最大化的減小了傳輸量,這也就是base64的由來。當我們解碼時,會把每個字符解碼成對應的6位二進制數據,進而實現了編碼前和編碼解碼後數據的一致性。

文首文字來源於

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