天天看點

Base64編碼原理概要

以下内容轉載自 https://www.toutiao.com/i6674357367456399879/

袁吳範2019-03-31 09:15:21

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。

來,舉個例子

文本helascii 編碼104101108二進制011010000110010101101100base64 6位01101000 0110010101101100base64 10進制編号2662144base64 結果aGVs

hel的base64編碼結果就是aGVs

base64碼表

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

原文來自:https://www.linuxidc.com/Linux/2019-03/157393.htm

本文位址:https://www.linuxprobe.com/base64-encoding-content.html

繼續閱讀