Base64編碼與解碼 Python實現

2021-10-08 19:01:43 字數 4245 閱讀 3416

3. base64編碼

4. base64解碼

記錄學習base64編碼與解碼的思考以及通過python實現。

這裡請參考文章:一文徹底看懂base64原理

宣告:本文的均來自上述文章。

我的理解就是,將待編碼字元集合與二進位制之間相互的等價轉換情況。

注意:base64是一種可以算是公開的加密方法 ,只能加密保護某些資料。

本小節主要介紹位元組、二進位制、ascii碼等知識,如果很熟悉可以跳過。

資料儲存是以「位元組」(byte)為單位,資料傳輸大多是以「位」(bit,又名「位元」)為單位,乙個位就代表乙個0或1(即二進位制),每8個位(bit,簡寫為b)組成乙個位元組(byte,簡寫為b),是最小一級的資訊單位。

8bit(位)=1byte(位元組)

因為計算機通訊和儲存的時候都bai是以010101這樣的二進位制資料為基礎du的,這兒的乙個0和1佔的地方就叫bit(位),即乙個二進位制位。

ascii碼中:乙個英文本母(不bai分大小寫)佔乙個位元組的空間,du乙個中文漢字佔兩個位元組的空間。

ascii碼對照表:ascii碼對照表

base64_charset = string.ascii_uppercase + string.ascii_lowercase + string.digits +

'+/'

編碼過程如下:

將三個位元組(字元)作為一組,也就轉換成3✖️8 = 24 bit,如果不足三個位元組(24bit),則補0。

再將上邊的24bit轉換成四組,即每組6bit。

將第二步得到的四組資料高位補0,實現完整的4個位元組,即4✖️8 = 32 bit,每個位元組表示base64的字符集索引。

將每個擴充套件後的新的8bit用作表示整數的索引,對應字符集的乙個字元,這就是編碼後的值。

最後處理在步驟1中不足3位元組的情況 ,缺乙個位元組索引,即為0時候,補乙個=,缺兩個就補兩個=。

注意:高位補0,可以讓原數不變,是高位。

str的相關用法

def

encode

(origin_str)

:# 將字串轉化為位元組

origin_bytes =

str(origin_str)

.encode(

)# 將每一位bytes轉換為二進位制字串,高位補0,這裡涉及str的format用法

str_bytes =[''

.format

(str

(bin

(b))

.replace(

'0b',''

))for b in origin_bytes]

resp =

''# 3個一組,整除3,看總共有多少組

group_nums =

len(str_bytes)//3

# 看餘數剩幾個字元

remain_str_nums =

len(str_bytes)%3

integral_part = str_bytes[0:

3* group_nums]

while integral_part:

# 取三個位元組,以每6位元,轉換為4個整數

tmp_bytes =

''.join(integral_part[0:

3]) tmp_bytes =

[int

(tmp_bytes[x: x +6]

,2)for x in[0

,6,12

,18]]

# 取對應base64字元

resp +=

''.join(

[base64_charset[i]

for i in tmp_bytes]

) integral_part = integral_part[3:

]if remain_str_nums:

# 補齊三個位元組,每個位元組補充 00000000

remain_part =

''.join(str_bytes[

3* group_nums:])

+(3- remain_str_nums)

*'0'*8

tmp_bytes =

[int

(remain_part[x: x +6]

,2)for x in[0

,6,12

,18]]

[: remain_str_nums +1]

# 這裡是對陣列進行擷取,為了防止產生不必要的資料

# 剩餘1位元組可構造2個base64字元,補充==;剩餘2位元組可構造3個base64字元,補充=

resp +=

''.join(

[base64_charset[i]

for i in tmp_bytes])+

(3- remain_str_nums)

*'='

return resp

解碼的過程實際上是編碼的乙個逆過程,理解了編碼,解碼也就對應二聲了。

判定給出的字串是不是乙個合法的經過base64編碼的字串。

對每乙個base64字元取下標索引,並轉換為6位二進位制字串。

取4個6位base64字元,作為3個位元組。

最後將不足四個的base64字元,進行其他處理。

# 判定是否合法

defisvalidbase64_str

(base64_str):if

len(base64_str)%4

:return

false

for b in base64_str:

if b not

in base64_charset and b is

not'='

:return

false

return

true

defdecode

(base64_str, isformat =

'0'):if

not isvalidbase64_str(base64_str)

:return

bytearray

# 對每乙個base64字元取下標索引,並轉換為6位二進位制字串

base64_bytes =[''

.format

(str

(bin

(base64_charset.index(s)))

.replace(

'0b',''

))for s in base64_str if

s !=

'=']

resp =

bytearray()

group_nums =

len(base64_bytes)//4

remain_str_nums =

len(base64_bytes)%4

integral_part = base64_bytes[0:

4* group_nums]

while integral_part:

# 取4個6位base64字元,作為3個位元組

tmp_str =

''.join(integral_part[0:

4]) tmp_str =

[int

(tmp_str[x: x +8]

,2)for x in[0

,8,16

]]for i in tmp_str:

integral_part = integral_part[4:

]if remain_str_nums:

remain_part =

''.join(base64_bytes[group_nums *4:

])tmp_str =

[int

(remain_part[i *8:

(i +1)

*8],

2)for i in

range

(remain_str_nums -1)

]for i in tmp_str:

output_str = resp.decode(

)if isformat ==

'1':

# 相應的處理

print

(isformat)

return output_str

base64編碼 解碼

ps base64是一種資料編碼方式,目的是讓資料符合傳輸協議的要求,有些人誤用它進行資料加密 base64編碼 nsstring base64encodedstringwithstring nsstring string base64解碼 nsstring base64decodedstringw...

Base64編碼解碼

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

Base64編碼與解碼原理

base64編碼是使用64個可列印ascii字元 a z a z 0 9 將任意位元組序列資料編碼成ascii字串,另有 符號用作字尾用途。base64編碼與解碼的基礎索引表如下 1 base64編碼過程 base64將輸入字串按位元組切分,取得每個位元組對應的二進位制值 若不足8位元則高位補0 然...