首頁 > 軟體

python中base64編碼簡介

2022-12-03 14:01:03

1. base64編碼簡介

用記事本開啟exe、jpg、pdf這些檔案時,我們都會看到一大堆亂碼,因為二進位制檔案包含很多無法顯示和列印的字元,所以,如果要讓記事本這樣的文書處理軟體能處理二進位制資料,就需要一個二進位制到字串的轉換方法。Base64是一種最常見的二進位制編碼方法。

Base64是一種任意二進位制到文字字串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進位制資料。Base64是一種用64個字元來表示任意二進位制資料的方法,原理很簡單,首先,準備一個包含64個字元的陣列['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/'] ,然後,對二進位制資料進行處理,每3個位元組一組,一共是3x8=24bit,劃為4組,每組正好6個bit,這樣我們得到4個數位作為索引,然後查表,獲得相應的4個字元,就是編碼後的字串。

每組6位->6位二進位制取值範圍為:000000-111111(0-63)正好可以取到64個字元

所以,Base64編碼會把3位元組的二進位制資料編碼為4位元組的文字資料,長度增加33%,好處是編碼後的文字資料可以在郵件正文、網頁等直接顯示。如果要編碼的二進位制資料不是3的倍數,最後會剩下1個或2個位元組怎麼辦?Base64用x00位元組在末尾補足後,再在編碼的末尾加上1個或2個=號,表示補了多少位元組,解碼的時候,會自動去掉。

2. python中使用base64

python中直接使用內建包base64即可,base64.b64encode base64.b64decode 分別是編碼和解碼

import base64
if __name__ == "__main__":
    bytes_str = b"i love beijing"
    # 編碼
    # b'aSBsb3ZlIGJlaWppbmc='
    base64_string = base64.b64encode(bytes_str)
    print(base64_string)
    # 解碼
    # b'i love beijing'
    source_str = base64.b64decode(base64_string)
    print(source_str)

由於標準的Base64編碼後可能出現字元+/,在URL中就不能直接作為引數,所以又有一種url safe 的base64編碼,其實就是把字元+/分別變成-_

bytes_str = b"i love tiananmen"
# 編碼
base64_string = base64.urlsafe_b64encode(bytes_str)
print(base64_string)
# 解碼
source_str = base64.urlsafe_b64decode(base64_string)
print(source_str)

注意:無論是哪種編碼方式,輸入到base64中的引數都是位元組的形式,因此上方中引數byte_str前有個b

3. 應用

將圖片(視訊)編碼成字串
如下程式碼,將一張圖片編碼成字串,後面我們可以將圖片直接以字串的形式儲存到檔案中,方便讀取,因為有些情況下存取字串會比直接儲存圖片方便,比如先把圖片存放到資料庫中

if __name__ == "__main__":
    import requests
    from PIL import Image
    from io import BytesIO
    import base64

    response = requests.get('https://ts1.cn.mm.bing.net/th/id/R-C.fd4056c8c00979ab8561f8db8219c2ae?rik=JPk67EIYaKIS3A&riu=http%3a%2f%2fimg.mm4000.com%2ffile%2fa%2fa2%2f869bd2bd6a.jpg&ehk=2z%2bPuRHJOYtkm9ICs8fPs0EJbE96jJX2E8QyrVP5kyQ%3d&risl=&pid=ImgRaw&r=0')
    if response.status_code != 200:
        raise ValueError("request Error!")
    # 將請求結果存入io中, 使用PIL以io的方式開啟圖片
    img = BytesIO(response.content)
    pict = Image.open(img)
    # 改變影象大小,也可是其他操作
    pict = pict.resize((100, 100), Image.ANTIALIAS)
    # 將圖片存入io中, PIL格式的圖片變成byte格式
    img_buff = BytesIO()
    pict.save(img_buff, "jpeg")
    # 使用base64把byte物件編碼成字串
    img_str = base64.urlsafe_b64encode(img_buff.getvalue())
    print("image string:", img_str.decode("utf-8"))
    img.close()

    # 將字串解碼成圖片
    bytes_image = base64.urlsafe_b64decode(img_str)
    image_buff = BytesIO(bytes_image)
    image = Image.open(image_buff)
    image.show()

結果如下:

到此這篇關於python中base64編碼的文章就介紹到這了,更多相關python base64編碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com