Python base64
一、base64可用函数集合
base64方法是成套的,即encode编码/decode解码
__all__ = [
'encode', # 编码后为字符型
'decode',
'encodebytes', # 编码后为字节型
'decodebytes',
'b64encode', # 64位编码后为字符型
'b64decode',
'b32encode', # 32位编码后为字符型
'b32decode',
'b16encode', # 16位编码后为字符型
'b16decode',
'b85encode',
'b85decode',
'a85encode',
'a85decode',
'standard_b64encode', # 标准的64位编码
'standard_b64decode',
'urlsafe_b64encode', # 当编码后,用于url参数时,可用此方法,因为url中有特须字符处理机制< '=' 为 '%3D' >
'urlsafe_b64decode',
]
二、函数详情
2-1 base64.encode()与base64.decode()
encode:对文件进行编码;输入和输出都是二进制文件
decode:对文件进行解码;输入和输出都是二进制文件
2-1-1 源代码
def encode(input, output): # input, output都是二进制文件
"""Encode a file; input and output are binary files."""
while True:
s = input.read(MAXBINSIZE) # input必须是open(xxx,'rb')对象
if not s:
break
while len(s) < MAXBINSIZE:
ns = input.read(MAXBINSIZE-len(s))
if not ns:
break
s += ns
line = binascii.b2a_base64(s)
output.write(line) # output必须是open(xxx,'wb')对象
def decode(input, output):
"""Decode a file; input and output are binary files."""
while True:
line = input.readline() # 按行读取文件内容
if not line:
break
s = binascii.a2b_base64(line)
output.write(s) # 写入新文件中
2-1-1 使用实例
对图片文件123.png编码,并输出到456.txt文件中
import base64
base64.encode(open('123.png', 'rb'), open('456.txt', 'wb')) # 编码
base64.decode(open('456.txt', 'rb'), open('789.png', 'wb')) # 解码
# encode与decode两个参数只接受二进制,所以open必须指定为'b'表示字节
生成456.txt文件内容
2-2 base64.b64encode()与base64.b64decode
b64encode:对二进制数据进行编码成字符串,适用于64位编码
b64decode:把字符串解码成二进制数据,适用于64位编码
2-2-1 源码
def b64encode(s, altchars=None):
encoded = binascii.b2a_base64(s, newline=False)
if altchars is not None:
assert len(altchars) == 2, repr(altchars)
return encoded.translate(bytes.maketrans(b'+/', altchars))
return encoded
def b64decode(s, altchars=None, validate=False):
s = _bytes_from_decode_data(s)
if altchars is not None:
altchars = _bytes_from_decode_data(altchars)
assert len(altchars) == 2, repr(altchars)
s = s.translate(bytes.maketrans(altchars, b'+/'))
if validate and not re.fullmatch(b'[A-Za-z0-9+/]*={0,2}', s):
raise binascii.Error('Non-base64 digit found')
return binascii.a2b_base64(s)
2-2-2 实例
encoded = base64.b64encode(open('123.png', 'rb').read()) # 将二进制数据编码成base64字符串
print(encoded)
decode = base64.b64decode(encoded) # 将base64字符串解码成二进制数据
print(decode)
open('abc.png', 'wb').write(decode) # 写入文件
2-3 base64.b32encode()与base64.b32decode
与b64encode/b64decode 同义,b64encode就是b32encode一种扩展
2-4 base64.urlsafe_b64encode()与base64.urlsafe_b64decode
现在网络上传/下载图片,在传递过程中把图片转换为base64字符串,但是作为url参数传递时,由于url中会转义<如:‘=’ 转换为 ‘%3D’>这样就改变了base64字符串内容,urlsafe_b64encode可以避免这种情况发生
urlsafe_b64encode:二进制数据编码为字符串
urlsafe_b64encode:字符串解码为二进制数据
2-4-1 源码
def urlsafe_b64encode(s):
return b64encode(s).translate(_urlsafe_encode_translation)
def urlsafe_b64decode(s):
s = _bytes_from_decode_data(s)
s = s.translate(_urlsafe_decode_translation)
return b64decode(s)
2-4-2 传输网络图片
import requests
res = request.get('https://www.baidu.com' + file_path)
encoded = base64.urlsafe_b64encode(res.content)
## 假如django后台
def str_json()
res = request.get('https://www.baidu.com' + file_path)
encoded = base64.urlsafe_b64encode(res.content)
return JsonResponse{'image_str': encoded }
# 显示图片用urlsafe_b64decode解码
decoded = base64.urlsafe_b64decode(encoded)