base64編碼的理解

2021-07-27 02:08:15 字數 1874 閱讀 3267

最近學python的時候遇到了編碼問題,順帶了解了一下base64編碼,首先閱讀了咱csdn上的一篇文章base64編碼原理,有所感悟,記錄下來以備日後檢視

首先,base64編碼是用64個字元來表示任意二進位制的資料的方法,有時候我們用記事本開啟.pdf,.exe, .png的字尾名的檔案時開啟是一堆亂碼。實際上這些二進位制檔案裡面包含了許多無法列印的字元,如果我們讓記事本能處理開啟這些檔案,就需要一種能處理二進位制檔案到字串的轉換的方法,就用到了base64編碼。

它很簡單,出現的原因也很單一:因為有些網路傳送渠道並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ascii碼的控制字元就不能通過郵件傳送。這樣用途就受到了很大的限制,比如二進位製流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協議的情況下,做一種擴充套件方案來支援二進位制檔案的傳送。把不可列印的字元也能用可列印字元來表示,問題就解決了。base64編碼應運而生,base64就是一種基於64個可列印字元來表示二進位制資料的表示方法。

首先,準備乙個包含64個字元的陣列:['a', 'b', 'c', ... 'a','b', 'c', ... '0', '1', ... '+', '/'],換成圖示來表示就是這樣的

1字元=1個位元組=1byte=8個bit,所以任意乙個上圖的64個字元中的都能用2的6次方以下的數來表示,換成二進位制來看,任意乙個base64編碼的字元最多就是佔位6個bit,但是規定就是乙個字元等於8個bit啊,現在你用乙個base64就叫我換成6個bit了,那我多下來的倆bit放**?那麼怎麼用6個有效bit來表示傳統字元的8個bit呢?8和6的最小公倍數是24,也就是說3個傳統位元組可以由4個base64字元來表示,保證有效位數是一樣的,這樣就多了1/3的位元組數來彌補base64只有6個有效bit的不足。你也可以說用兩個base64字元也能表示乙個傳統字元,但是採用最小公倍數的方案其實是最減少浪費的。結合下邊的圖比較容易理解。man是三個字元,一共24個有效bit,只好用4個base64字元來湊齊24個有效位。紅框表示的是對應的base64,6個有效位轉化成相應的索引值再對應base64字元表,查出"man"對應的base64字元是"twfu"。說到這裡有個原則不知道你發現了沒有,要轉換成base64的最小單位就是三個位元組,對乙個字串來說每次都是三個位元組三個位元組的轉換,對應的是base64的四個位元組。這個搞清楚了其實就差不多了。

說起base64編碼可能有些奇怪,因為大多數的編碼都是由字元轉化成二進位制的過程,而從二進位制轉成字元的過程稱為解碼。而base64的概念就恰好反了,由二進位制轉到字元稱為編碼,由字元到二進位制稱為解碼。

base64編碼主要用在傳輸、儲存、表示二進位制等領域,還可以用來加密,但是這種加密比較簡單,只是一眼看上去不知道什麼內容罷了,當然也可以對base64的字串行進行定製來進行加密。

由於=字元也可能出現在base64編碼中,但=用在url、cookie裡面會造成歧義,所以,很多base64編碼後會把=去掉:

# 標準base64:

'abcd' -> 'ywjjza=='

# 自動去掉=:

'abcd' -> 'ywjjza'

去掉=後怎麼解碼呢?因為base64是把3個位元組變為4個位元組,所以,base64編碼的長度永遠是4的倍數,因此,需要加上=把base64字串的長度變為4的倍數,就可以正常解碼了

base64編碼 動畫演示 Base 64 編碼

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

BASE64編碼原理解析

1.每個字元按照ascii編碼對應乙個8bit,以3字元為一組 2.3 8 24,分成4份,每份6bit,在每份高位新增00,重新合成乙個4份8bit資料 3.新的4份8bit資料換算成10進製,得到4個數字 4.根據下面的base64編碼表,得到對應的新的字元 jascii 8374 748bit...

base64編碼原理解析

一.base64編碼由來 為什麼會有base64編碼呢?因為有些網路傳送渠道並不支援所有的位元組,例如傳統的郵件只支援可見字元的傳送,像ascii碼的控制字元就不能通過郵件傳送。這樣用途就受到了很大的限制,比如二進位製流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協議...