Base64編碼的原理

Base64是一種基於64個可打印字符來表示二進制數據的表示方法。由於 2的6次方是64,所以每6個比特爲一個單元,對應某個可打印字符。3個字節有24個比特,對應於4個Base64單元,即3個字節可由4個可打印字符來表示。它可用來作爲電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Z、a-z、數字0-9,這樣共有62個字符,此外兩個可打印符號在不同的系統中而不同。
在MIME格式中,剩餘兩個字符是加號+和斜槓/,等號=用來作爲後綴用途。
UTF-7是一個修改版Base64,主要的區別在於不用等號=補餘,因爲該字符通常需要大量的轉譯。
在IRCu等軟件所使用的P10 IRC服務器間協議中,將+/改成了[]。
Base64編碼可用於在HTTP環境下傳遞,不在末尾填充=號,並將標準Base64中的+和/分別改成了-和_。

base64的原理

base64編碼後的數據比原始數據略長,比原來長1/3。爲什麼會長1/3?我們學習下原理,之後工作中base64就再也不會擋道了。
轉換的時候,將3字節的數據,先後放入一個24位的緩衝區中,先來的字節佔高位。數據不足3字節的話,於緩衝器中剩下的比特用0補足。每次取出6比特,按照其值選擇ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作爲編碼後的輸出,直到全部輸入數據轉換完成。若原數據長度不是3的倍數時且剩下1個輸入數據,則在編碼結果後加2個=;若剩下2個輸入數據,則在編碼結果後加1個=。
換句話,本來3個字節,base64經過自己的編碼成爲4個字節。比原理多了1/3。
來,舉個例子

文本 h e l
ascii 編碼 104 101 108
二進制 01101000 01100101 01101100
base64 6位 011010 00 0110 010101 101100
base64 10進制編號 26 6 21 44
base64 結果 a G V s

hel的base64編碼結果就是aGVs

base64碼錶
在這裏插入圖片描述

base64的應用

base64的應用特別廣泛,個人在開發中遇到最多的兩個方面,第一個是URL的base64,另一個是圖片base64。
先說第一種,已經有urlencode了,爲什麼還需要base64 的URL。各有用途。
urlencode是將-_. 之外的所有非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼爲加號(+)。如果一個URL裏面有+ 有空格,是不是urlencode就搞不定,使用base64就會迎刃而解。帶來的代價就URL比原理長了1/3

圖片編碼的問題,經常跟客戶端開發的時候,客戶端使用二進制流上傳圖片的時候比較複雜,就可以使用base64將圖片的二進制編碼轉成base64,服務端接到數據之後再basedecode之後就是圖片的二進制流。特別方便,帶來的結果就是,傳輸的數據多了1/3。

遇到的問題

根據RFC 822規定,每76個字符,還需要加上一個回車換行。
出問題的一般都是822規定,有的語言,對base64decode的時候,發現有換行符就decode失敗了,究其原因基本都市822規定,有很多換行,decode的時候解碼失敗,知道原因了就特別簡單,將換行符\r|\r\n 替換成 空,再base64decode就可以了。

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