日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 简易实现 base64 编码

發布時間:2023/12/20 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 碼,就能表示繁多的二進制文件中復雜的數據。

二、舉例說明 ?

  • 例-1
  • 試將數據 11001100 10000001 00111000 進行 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 碼,可以直接通過內置函數完成:

    >>>a = "A" >>>b = ord(a) >>>b >65

    (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 直接轉換為十進制列表:

    >>>a = '嗶哩嗶哩彈幕網' >>>b = a.encode('utf-8') >>>list(b) >[229, 147, 148, 229, 147, 169, 229, 147, 148, 229, 147, 169, 229, 188, 185, 229, 185, 149, 231, 189, 145]

    這就很方便了。

    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 編碼表

    >>>a = '10' >>>b = int(a, 2) >>>b >2

    查找 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 编码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。