python中base64編碼簡介
1. base64編碼簡介
用記事本打開exe、jpg、pdf這些文件時,我們都會看到一大堆亂碼,因為二進制文件包含很多無法顯示和打印的字符,所以,如果要讓記事本這樣的文本處理軟件能處理二進制數(shù)據(jù),就需要一個二進制到字符串的轉(zhuǎn)換方法。Base64是一種最常見的二進制編碼方法。
Base64是一種任意二進制到文本字符串的編碼方法,常用于在URL、Cookie、網(wǎng)頁中傳輸少量二進制數(shù)據(jù)。Base64是一種用64個字符來表示任意二進制數(shù)據(jù)的方法,原理很簡單,首先,準備一個包含64個字符的數(shù)組['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
,然后,對二進制數(shù)據(jù)進行處理,每3個字節(jié)一組,一共是3x8=24bit,劃為4組,每組正好6個bit,這樣我們得到4個數(shù)字作為索引,然后查表,獲得相應的4個字符,就是編碼后的字符串。
每組6位->6位二進制取值范圍為:000000-111111(0-63)正好可以取到64個字符
所以,Base64編碼會把3字節(jié)的二進制數(shù)據(jù)編碼為4字節(jié)的文本數(shù)據(jù),長度增加33%,好處是編碼后的文本數(shù)據(jù)可以在郵件正文、網(wǎng)頁等直接顯示。如果要編碼的二進制數(shù)據(jù)不是3的倍數(shù),最后會剩下1個或2個字節(jié)怎么辦?Base64用\x00
字節(jié)在末尾補足后,再在編碼的末尾加上1個或2個=號,表示補了多少字節(jié),解碼的時候,會自動去掉。
2. python中使用base64
python中直接使用內(nèi)置包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編碼后可能出現(xiàn)字符+
和/
,在URL中就不能直接作為參數(shù),所以又有一種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中的參數(shù)都是字節(jié)的形式,因此上方中參數(shù)byte_str
前有個b
3. 應用
將圖片(視頻)編碼成字符串
如下代碼,將一張圖片編碼成字符串,后面我們可以將圖片直接以字符串的形式保存到文件中,方便讀取,因為有些情況下存取字符串會比直接保存圖片方便,比如先把圖片存放到數(shù)據(jù)庫中
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編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python中的函數(shù)式編程:不可變的數(shù)據(jù)結構
今天小編就為大家分享一篇關于Python中的函數(shù)式編程:不可變的數(shù)據(jù)結構,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10python輕松實現(xiàn)代碼編碼格式轉(zhuǎn)換
由于某些原因,需要將代碼從A機房遷移到B機房,這兩個之間不能互相訪問,但是歷史原因?qū)е翧機房的代碼全是utf8編碼的,B機房要求是GBK編碼,看看這個怎么解決。雖然很簡單,但是還是要推薦給大家,需要的小伙伴參考下吧。2015-03-03python在命令行中使用?pdb?實現(xiàn)斷點調(diào)試功能
在命令行中設置斷點通常需要使用調(diào)試工具來實現(xiàn),下面以 Python 為例介紹如何在命令行中使用pdb實現(xiàn)斷點調(diào)試,這篇文章主要介紹了python在命令行中使用pdb實現(xiàn)斷點調(diào)試,需要的朋友可以參考下2023-06-06對TensorFlow中的variables_to_restore函數(shù)詳解
今天小編就為大家分享一篇對TensorFlow中的variables_to_restore函數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07python高級搜索實現(xiàn)高效搜索GitHub資源
這篇文章主要為大家介紹了python高級搜索來高效搜索GitHub,從而高效獲取所需資源,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11Python?VisPy庫高性能科學可視化圖形處理用法實例探究
VisPy是一個用于高性能科學可視化的Python庫,它建立在現(xiàn)代圖形處理單元(GPU)上,旨在提供流暢、交互式的數(shù)據(jù)可視化體驗,本文將深入探討VisPy的基本概念、核心特性以及實際應用場景,并通過豐富的示例代碼演示其強大的可視化能力2023-12-12在pycharm中使用matplotlib.pyplot 繪圖時報錯的解決
這篇文章主要介紹了在pycharm中使用matplotlib.pyplot 繪圖時報錯的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06