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就可以了。

------------------------------------end
一起關注高性能WEB后端技術,關注公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM