了解Base64編碼

2021-08-08 20:06:20 字數 2313 閱讀 7582

偶爾看到http協議中用到base64編碼,了解一下,記錄一下

1.既然說到編碼,那就要說一下什麼是編碼?

簡單說編碼就是乙個字符集到另乙個字符集的對映關係

再回來說http用到的base64編碼,按照上面說到的既然用了base64編碼,那肯定是有原因的?在找到原因之前,先了解這兩個概念。

文字協議和二進位制協議
首先說http是一種文字協議,此外xml也是一種文字協議,我們使用的各種程式語言也可以理解為一種文字協議,甚至於我們正常使用各種語言文字也可以理解為文字協議。在我們掌握了協議的基本的語法語義規則後,給我們一段遵守協議規範的文字,我們就可以理解文字表達的意義。其實文字協議更多的是一種相對的概念,相對二進位制協議來說,如果我們都能以二進位制機器的思維來思考,這種相對性也就不那麼明顯了,大家都能直接看懂二進位制,又何必費勁讓機器再轉成文字了呢,直接跟機器用二進位制交流得了。

好吧,因為二進位制相對我們人類的思維來說實在是太非人類了,為了讓人能更好的理解互動內容,文字協議誕生了。

也正因為文字協議一般是面向人的,所以一般文字協議都是高層協議,而二進位制協議一般則比較偏向底層,用於機器的互動(這裡的一般是因為實在不清楚是不是有什麼特例)。

最常見的就是http協議和tcp協議了,從報文格式上就可以看出來,tcp報文格式可以參考tcp/ip協議詳解,一般通訊類的教材也會有介紹,報文頭,標誌位,字段長度,控制,校驗····頭大,真不是給人看的。下面看一段http報文。

拿到一段http報文

根據http報文語法,我可以知道這是以post方式去請求服務端的某乙個介面,傳遞了那些引數,設定了那些header;我的請求是成功了還是失敗了,服務端又返回了什麼結果;如果是一堆二進位制01的話,想知道這些就不是掌握http協議語法那麼簡單了。

扯這多,一句話就是文字協議是給人看的,二進位制協議是給機器用的。

既然已經扯了這麼多,不妨扯遠點,既然是文字協議,那就是由可見文字構成的,所有可見文字必定是由有限字符集來表示。

http字符集與字元編碼

這裡就指明了字符集型別utf-8

雙方要互動就要求至少有一方要掌握對方的「語言」,這實在是非人道的,相信大部分需要學習英語的人都有這種想法。那有麼有一種語言大家都去用它,其實英語作為國際通用語就承擔了這種功能,那麼字符集界是否也能有一種類似的扛把子存在呢?

「unicode編碼系統為表達任意語言的任意字元而設計。它使用4位元組的數字來表達每個字母、符號,或者表意文字(ideograph)。每個數字代表唯一的至少在某種語言中使用的符號。(並不是所有的數字都用上了,但是總數已經超過了65535,所以2個位元組的數字是不夠用的。)被幾種語言共用的字元通常使用相同的數字來編碼,除非存在乙個在理的語源學(etymological)理由使不這樣做。不考慮這種情況的話,每個字元對應乙個數字,每個數字對應乙個字元。即不存在二義性。不再需要記錄」模式」了。u+0041總是代表』a』,即使這種語言沒有』a』這個字元。」

先看一下base64用在什麼地方。

前面說unicode編碼解決了不同語言字符集的相容問題,這是文字的編碼問題,但是我們使用http也會傳輸一些等二進位制的檔案,這些是非文字的,在http協議報文裡怎麼表示這些檔案呢?一種解決方式就是把二進位制資料用文本來表示。base64 就是一種能夠把二進位制資料表示成文字形式的編碼方式。

字符集
標準base64的字符集是ascii字符集的乙個子集,包含64個字元

a-za-z0-9+/

如果使用二級制表示的話需要滿足2^n=64,n=6,正好需要6位。

記憶體中資料是按位元組儲存的,一位元組8bit,二進位制資料怎麼對映字符集?

對映關係
為了保證二進位制資料完整對映到base64字符集,取6和8的最小公約數24(3*8=4*6).每24位為一組進行對映。24位分成四組,每組高位補0到8位,以在計算機中表示。

不足24位的情況先用0補足到6的整數倍,對映成字元,不足四個字元用=補足字元位數。

解碼時每四個字元為一組,去掉字元=,對映到二進位制,去掉高位補0,保證8的整數倍,如必要(不是8的整數倍)截尾

思路就是這樣

參考:

字符集和字元編碼

如何用通俗易懂的語言解釋base64?

base64 前世今生

了解Base64編碼解碼

我們經常說base64,那base64到底是什麼呢?base64是一種基於64個可列印字元來表示二進位制資料的表示方法,常用於在通常處理文字資料的場合,表示 傳輸 儲存一些二進位制資料,會將不便於檢視的二進位制資料用base64進行表示。所以bsea64經常用於密碼學中,因為密碼學通常用二進位制進行...

base64編碼 動畫演示 Base 64 編碼

base64 是一種十分流行的編碼方式,僅僅使用 64 個字元加等號 就可以以文字的形式表示所有的二進位制資料了,因為它能夠把二進位制格式通過編碼轉換成可見字元,所有我們就可以通過的把二進位制格式比如,檔案等通過 base64 編碼然後通過文字的形式共享出去,是不是很神奇呀。把輸入的資料轉換成 二進...

Base64編碼演算法

base64要求把每三個8bit的位元組轉換為四個6bit的位元組 3 8 4 6 24 然 後把6bit再添兩位高位0,組成四個8bit的位元組,也就是說,轉換後的字串理 論上將要比原來的長1 3。轉換後,我們用乙個碼表來得到我們想要的字串 也就是最終的base64編碼 這個表是這樣的 0 a 1...