python中base64編碼簡介
1. base64編碼簡介
用記事本打開exe、jpg、pdf這些文件時(shí),我們都會看到一大堆亂碼,因?yàn)槎M(jìn)制文件包含很多無法顯示和打印的字符,所以,如果要讓記事本這樣的文本處理軟件能處理二進(jìn)制數(shù)據(jù),就需要一個(gè)二進(jìn)制到字符串的轉(zhuǎn)換方法。Base64是一種最常見的二進(jìn)制編碼方法。
Base64是一種任意二進(jìn)制到文本字符串的編碼方法,常用于在URL、Cookie、網(wǎng)頁中傳輸少量二進(jìn)制數(shù)據(jù)。Base64是一種用64個(gè)字符來表示任意二進(jìn)制數(shù)據(jù)的方法,原理很簡單,首先,準(zhǔn)備一個(gè)包含64個(gè)字符的數(shù)組['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/'] ,然后,對二進(jìn)制數(shù)據(jù)進(jìn)行處理,每3個(gè)字節(jié)一組,一共是3x8=24bit,劃為4組,每組正好6個(gè)bit,這樣我們得到4個(gè)數(shù)字作為索引,然后查表,獲得相應(yīng)的4個(gè)字符,就是編碼后的字符串。
每組6位->6位二進(jìn)制取值范圍為:000000-111111(0-63)正好可以取到64個(gè)字符
所以,Base64編碼會把3字節(jié)的二進(jìn)制數(shù)據(jù)編碼為4字節(jié)的文本數(shù)據(jù),長度增加33%,好處是編碼后的文本數(shù)據(jù)可以在郵件正文、網(wǎng)頁等直接顯示。如果要編碼的二進(jìn)制數(shù)據(jù)不是3的倍數(shù),最后會剩下1個(gè)或2個(gè)字節(jié)怎么辦?Base64用\x00字節(jié)在末尾補(bǔ)足后,再在編碼的末尾加上1個(gè)或2個(gè)=號,表示補(bǔ)了多少字節(jié),解碼的時(shí)候,會自動去掉。
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)由于標(biāo)準(zhǔn)的Base64編碼后可能出現(xiàn)字符+ 和/,在URL中就不能直接作為參數(shù),所以又有一種url safe 的base64編碼,其實(shí)就是把字符+和/分別變成-和_
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前有個(gè)b
3. 應(yīng)用
將圖片(視頻)編碼成字符串
如下代碼,將一張圖片編碼成字符串,后面我們可以將圖片直接以字符串的形式保存到文件中,方便讀取,因?yàn)橛行┣闆r下存取字符串會比直接保存圖片方便,比如先把圖片存放到數(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!")
# 將請求結(jié)果存入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()結(jié)果如下:

到此這篇關(guān)于python中base64編碼的文章就介紹到這了,更多相關(guān)python base64編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中的函數(shù)式編程:不可變的數(shù)據(jù)結(jié)構(gòu)
今天小編就為大家分享一篇關(guān)于Python中的函數(shù)式編程:不可變的數(shù)據(jù)結(jié)構(gòu),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10
python輕松實(shí)現(xiàn)代碼編碼格式轉(zhuǎn)換
由于某些原因,需要將代碼從A機(jī)房遷移到B機(jī)房,這兩個(gè)之間不能互相訪問,但是歷史原因?qū)е翧機(jī)房的代碼全是utf8編碼的,B機(jī)房要求是GBK編碼,看看這個(gè)怎么解決。雖然很簡單,但是還是要推薦給大家,需要的小伙伴參考下吧。2015-03-03
深入解析Python編程中super關(guān)鍵字的用法
Python的子類調(diào)用父類成員時(shí)可以用到super關(guān)鍵字,初始化時(shí)需要注意super()和__init__()的區(qū)別,下面我們就來深入解析Python編程中super關(guān)鍵字的用法:2016-06-06
使用python求解迷宮問題的三種實(shí)現(xiàn)方法
關(guān)于迷宮問題,常見會問能不能到達(dá)某點(diǎn),以及打印到達(dá)的最短路徑,下面這篇文章主要給大家介紹了關(guān)于如何使用python求解迷宮問題的三種實(shí)現(xiàn)方法,需要的朋友可以參考下2022-03-03
python在命令行中使用?pdb?實(shí)現(xiàn)斷點(diǎn)調(diào)試功能
在命令行中設(shè)置斷點(diǎn)通常需要使用調(diào)試工具來實(shí)現(xiàn),下面以 Python 為例介紹如何在命令行中使用pdb實(shí)現(xiàn)斷點(diǎn)調(diào)試,這篇文章主要介紹了python在命令行中使用pdb實(shí)現(xiàn)斷點(diǎn)調(diào)試,需要的朋友可以參考下2023-06-06
對TensorFlow中的variables_to_restore函數(shù)詳解
今天小編就為大家分享一篇對TensorFlow中的variables_to_restore函數(shù)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
python高級搜索實(shí)現(xiàn)高效搜索GitHub資源
這篇文章主要為大家介紹了python高級搜索來高效搜索GitHub,從而高效獲取所需資源,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
Python?VisPy庫高性能科學(xué)可視化圖形處理用法實(shí)例探究
VisPy是一個(gè)用于高性能科學(xué)可視化的Python庫,它建立在現(xiàn)代圖形處理單元(GPU)上,旨在提供流暢、交互式的數(shù)據(jù)可視化體驗(yàn),本文將深入探討VisPy的基本概念、核心特性以及實(shí)際應(yīng)用場景,并通過豐富的示例代碼演示其強(qiáng)大的可視化能力2023-12-12
在pycharm中使用matplotlib.pyplot 繪圖時(shí)報(bào)錯(cuò)的解決
這篇文章主要介紹了在pycharm中使用matplotlib.pyplot 繪圖時(shí)報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
利用Python實(shí)現(xiàn)數(shù)值積分的方法
這篇文章主要介紹了利用Python實(shí)現(xiàn)數(shù)值積分。本文主要用于對比使用Python來實(shí)現(xiàn)數(shù)學(xué)中積分的幾種計(jì)算方式,并和真值進(jìn)行對比,加深大家對積分運(yùn)算實(shí)現(xiàn)方式的理解2022-02-02

