base64 編碼原理例項分析

2021-09-26 13:23:26 字數 2084 閱讀 4639

預處理時經常會用到base64的編碼方式,但其實base64能基於64個可列印字元來表示任意二進位制資料,其過程是可逆的。

根據乙個例項來表示編碼過程,比如單詞:image

1、首先,我們根據ascii碼對應**找到每個字母對應的值:

2、因為base64的碼值範圍在0~63,所以只需要6bit即可表示,上面5個字母的二進位制連在一起 5*8=40 bit的資料並不能被6整除,所以需要在末尾補零,每次補8個,直到既能被6整除,又能被8整除(最小公倍數),在這個例子中只需要補一次得到 48bit 正好可以滿足:

原始: 01101001 01101101 01100001 01100111 01100101 (每8bit寫在一起)

轉換並補零:011010 010110 110101 100001 011001 110110 010100 000000 (每6bit寫在一起)

3、將轉換後的資料,按照base64的編碼表進行編碼,需要注意的是如果6bit的資料都來自於填充,那麼用』='編碼(也就是說base64其實是使用了65個字元來編碼的):

011010(26,a) 010110(22,w) 110101(53,1) 100001(33,h) 011001(25,z) 110110(54,2) 010100(20,u) 000000(填充0,=)

所以編碼結果為:aw1hz2u=

補充:對於 a 和 = 的區別可以通過乙個例子解釋,假設輸入為 x

按照之前的步驟,x對應的ascii碼值為:01011000每6位劃分為:010110 00進行補零 8+8=16 不能被6整除,所以再次補零 16+8=24 滿足條件,所以最終轉化為:010110 000000 000000 000000

按照base64表對其編碼:010110(22,w) 000000(前兩bit非填充,a) 000000(填充0,=) 000000(填充0,=)

所以編碼結果為:wa==

平時使用python進行base64編譯碼時,只需要簡單的呼叫函式即可:

(注意:python3中字元都為unicode編碼,而b64encode函式的引數為byte型別,所以必須先轉碼。)

s = "image"

bs = base64.b64encode(s.encode("utf-8")) # 將字元為unicode編碼轉換為utf-8編碼

print(bs) # 得到的編碼結果前帶有 b

>>> b'aw1hz2u='

#與之前原理推導結果相同

bbs = str(base64.b64decode(bs), "utf-8")

print(bbs) # 解碼

>>> image

bs = str(base64.b64encode(s.encode("utf-8")), "utf-8")

print(bs) # 去掉編碼結果前的 b

>>> aw1hz2u=

bbs = str(base64.b64decode(bs), "utf-8")

print(bbs) # 解碼

>>> image

#帶不帶b,解碼方式相同

Base64編碼原理分析

base64是網路上最常見的用於傳輸 8bit 位元組 的編碼方式之一,在了解 base64 編碼之前,先了解幾個基本概念 位 位元組。位 位 bit 是計算機中最小的資料單位。每一位的狀態只能是0或 1 位元組 8個二進位制位構成1個 位元組 byte 位元組是儲存空間的基本計量單位。1個位元組可...

Base64編碼原理分析

base64是網路上最常見的用於傳輸8bit位元組 的編碼方式之一,在了解base64編碼之前,先了解幾個基本概念 位 位元組。位 位 bit 是計算機中最小的資料單位。每一位的狀態只能是0或1 位元組 8個二進位制位構成1個 位元組 byte 位元組是儲存空間的基本計量單位。1個位元組可以儲存1個...

Base64編碼原理分析

base64是網路上最常見的用於傳輸8bit位元組 的編碼方式之一,在了解base64編碼之前,先了解幾個基本概念 位 位元組。位 位 bit 是計算機中最小的資料單位。每一位的狀態只能是0或1 位元組 8個二進位制位構成1個 位元組 byte 位元組是儲存空間的基本計量單位。1個位元組可以儲存1個...