Python 简易实现 base64 编码
參考鏈接:
- base64 - 百度百科
- python中base64編碼與解碼
- 編碼、進制轉換、漢字轉二進制
- Python將形如”\xe4…"的十六進制編碼字符串恢復為中文
以下有關內容基于 Python 3:
Python 簡易實現 base64 編碼
目錄
1. 什么是 base64 編碼
2. 舉例說明
3. 如何用 Python 實現
4. 具體代碼
5. 代碼運行展示
6. 更簡單的代碼
7. 心得總結
一、什么是 base64 編碼 ?
對于任意的二進制文件,可用 base64 編碼。這種編碼方法是先把二進制代碼劃分為一個個 24 位長的單元,然后把每一個 24 位單元劃分為 4 個 6 位組。每一個 6 位組按以下方法轉換為 ASCII 碼。6 位的二進制碼共有 64 種不同的值,從 0 到 63。用 A 表示 0,用 B 表示 1,等等。26 個大寫字母排列完畢之后,接下去再排 26 個小寫字母,在后面是 10 個數字。最后用 “+” 表示 62,用 “/” 表示 63。再用兩個連在一起的等號 “==” 和 一個等號 “=” 分別表示最后一組的代碼只有 8 位或 16 位。回車和換行都忽略,它們可在任何地方插入。 —— 摘自 《計算機網絡(第7版)》
簡單點說,就是每個字節變為 8 位二進制,拼在一起,其中每 6 位轉變為一個 ASCII 碼,不足位填充 0 直至滿足 6 位的條件,繼續轉變為 ASCII 碼。將這些二進制 ASCII 碼變為十進制,接著查找 base64 編碼表,所得的結果組成的字符串就是 base64 編碼的結果,不足 4 的倍數,末尾添加 = 。通過 base64 編碼,只需要用簡單的 ascii 碼,就能表示繁多的二進制文件中復雜的數據。
二、舉例說明 ?
先將 24 比特的二進制數字劃分為 4 個 6 位組:
110011 001000 000100 111000,得出十進制的值 51,8,4,56。因為 6 位組的值在 0 到 63 之間,因此每一個值可以唯一地與一個 ASCII 代碼相對應。
根據 base64 編碼表,把上面的這些值轉換為對應的 ASCII 代碼:zIE4
以上的過程可以由下圖表示:
再查找 ASCII 編碼表,得出對應的二進制代碼為:
01111010 01001001 01000101 00110100
三、如何用 Python 實現 ?
那么,該如何用 Python 實現這些步驟呢?
讓我們一步一步解決問題【假設我們已經獲得一個字符串】:
1. 想辦法將字符串中所有的內容變為十進制
(1)ascii 碼,可以直接通過內置函數完成:
(2)非 ascii 碼,通過編碼:
>>>a = '嗶哩嗶哩彈幕網' >>>b = a.encode('utf-8') >>>b >b'\xe5\x93\x94\xe5\x93\xa9\xe5\x93\x94\xe5\x93\xa9\xe5\xbc\xb9\xe5\xb9\x95\xe7\xbd\x91'可以得到一連串的 16 進制碼,\x后面的兩個字符,就是十六進制后的結果。
接下來,我們就要嘗試把這些 16 進制的內容,變為十進制數字,用內置函數 list 直接轉換為十進制列表:
這就很方便了。
2. 將十進制數字轉換為二進制
>>>b = 10 >>>str(bin(b))[2:] >'1010'3. 經過我的研究,要將不足8位的二進制,填充為 8 位二進制
>>>a = '11000' >>>a.zfill(8) >'00001100'4. 拼接二進制字符串,并填充二進制字符串為 6 的倍數,用 0 填充
方法很多我就不多介紹了。
5. 劃分二進制字符串,6 位為一個單元
6. 將 6 位二進制串,轉換為十進制數字,并查找 base64 編碼表
查找 base64 編碼表,可以通過創建一個鍵值對應的字典,來實現查找內容,如果不想手動行行輸入的話,嘗試用編程解決 base64 編碼表生成的問題,比如:
string_temp = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' '0123456789+/') base64_dict = {} for i in range(2**6):base64_dict[i] = string_temp[i]7. 查完表后,組成字符串,檢查是否為 4 的倍數,不足填充 = ,直到滿足 4 的倍數為止。
因為簡單的 base64 編碼或其他情況,會因為不足 4 的倍數,而填充 = ,因此我們這里也要實現填充 = 的功能
到此,base64 編碼也就是實現完成,接下來用具體的代碼,來完成上面的步驟。
四、具體代碼 ?
測試例子:嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili,ascii + 非 ascii:
class MyBase64():base64_dict = {}string_temp = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' '0123456789+/')ascii_string = ''.join([chr(i) for i in range(4, 2**7-1)])def __init__(self, string):# 初始化,創建 base64 編碼字典self.string = stringfor i in range(2**6):self.base64_dict[i] = self.string_temp[i]def convert(self):# base64 編碼過程# 編碼string_encode_byte = self.string.encode('utf-8')# 十進制化string_digit_list = list(string_encode_byte)# 二進制化 + 0 填充string_bin_list = []for item in string_digit_list:string_bin_list.append(str(bin(item))[2:].zfill(8))# 字符串合并string_sum = ''.join(string_bin_list)# 6 的倍數,不足 0 填充string_fill = self.fillIt(string_sum, factor=6, item='0')# 切片,6位一個單位string_bin_list2 = self.splitIt(string_fill, bits=6)# 十進制化string_digit_list2 = []for item in string_bin_list2:string_digit_list2.append(int(item, 2))# 查表string_base64_list = []for item in string_digit_list2:string_base64_list.append(self.base64_dict[item])# 拼接string_sum2 = ''.join(string_base64_list)# 4 的倍數,不足填充 = string_convert = self.fillIt(string_sum2, factor=4, item='=')return string_convertdef fillIt(self, string, factor, item):"""指定倍數填充指定字符string:原字符串factor:倍數item:填充字符"""length = len(string)remainder = length % factorif remainder:times = factor - remainderstring = string + times * itemreturn stringdef splitIt(self, string, bits):"""指定位數切片string:原字符串bits:每次切片數量"""length = len(string)new_list = []for i in range(bits, length+1, bits):new_list.append(string[i-bits:i])remain = length % bitsif remain != 0:new_list.append(string[-remain:])return new_listif __name__ == '__main__':test_string = '嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili'myBase64 = MyBase64(test_string)string = myBase64.convert()print("測試字符串:{}".format(test_string))print("base64:{}".format(string))五、代碼運行展示 ?
截圖自:站長工具 > Base64加密解密
六、更簡單的代碼 ?
其實 Python 自帶了 base64 編碼的庫:
import base64s = '嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili'.encode() a = base64.b64encode(s) print(a)base64 庫,可以方便地將原字符串轉變為 base64 編碼后的結果。
七、心得總結 ?
雖然有 base64 庫,可以方便的編碼,但是知道了 base64 編碼到底是怎么回事之后,對它的掌握將更加的隨心所欲。而且,Python 編碼確實是個頭疼的問題。在這次實現 base64 過程中,我們就能發現,能深入淺出的懂得如何使用 Python 的編碼也是一件很重要的事情。
點我回頂部 ?
?
?
?
?
?
?
?
Fin.
總結
以上是生活随笔為你收集整理的Python 简易实现 base64 编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端面试笔记-CSS篇
- 下一篇: 狗熊会python培训班