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 然...