base64

介绍

base64模块真正用的上的方法只有8个,分别是encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。他们8个可以两两分为4组。

encode,decode一组,专门用来编码和解码文件的,也可以StringIO里的数据做编解码;

encodestring,decodestring一组,专门用来编码和解码字符串; (Python3 已弃用)

b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能;

b64encode(s, altchars=None)
base64.b64encode('房间')
base64.b64encode('房间', altchars='-_')

base64.b64decode(s, altchars=None)
base64.b64decode('5oi/6Ze0')
base64.b64decode('5oi_6Ze0', altchars='-_')

这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什 么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。

urlsafe_b64encode和urlsafe_b64decode一组,这个就是用来专门对url进行base64编解码的。实际上也是调用的前一组函数。
The alphabet 使用 '-' 代替 '+', 使用 '_' 代替 '/'.

使用

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import base64

base64 编码 字符串

string = 'Hello World!'
base64_string = "SGVsbG8gV29ybGQh"

# unicode -> utf-8
bytesString = string.encode(encoding="utf-8")

# base64 编码
data = base64.b64encode(bytesString)

# utf-8 -> unicode
print(data.decode('utf-8'))

base64 解码 字符串

# unicode -> utf-8
bytesString = base64_string.encode(encoding="utf-8")

# base64 解码
data = base64.b64decode(bytesString)

# utf-8 -> unicode
print(data.decode('utf-8'))

base64 编码 文件

file_in = r"file_in.txt"
file_out = r"file_out.txt"

with open(file_in, 'rb') as fin, open(file_out, 'wb') as fout:
    base64.encode(fin, fout)

base64 解码 文件

base64_in = r"base64_in.txt"
base64_out = r"base64_out.txt"

with open(base64_in, 'rb') as fin, open(base64_out, 'wb') as fout:
    base64.decode(fin, fout)

base64 编码 图片

img_file_in = r'./img_base64_in.png'

with open(img_file_in, 'rb') as f:
        bytesString = f.read()

# base64 编码
data = base64.b64encode(bytesString)

# utf-8 -> unicode
print(data.decode('utf-8'))

base64 解码 图片

import base64

img_base64_in = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADCklEQVQ4jXWTTWhUdxTFz/3/33w2CdNMQkMaqfmAGqziIiRtESutkqKgmEUJootSKF0I4kK3ChoUa6ltLWiRbrqsUlsrWlMVP6K2BCtBtDZ+JdFM6ryYmHHezHsv754uEo2bXjhwuPdyFgd+INlNMkcympFyRqTqnOfsZu6POZLdIOnOniKSOjEZ6ZZted25x6WqMjcW8tNNYzxwcEJnMl+EkKSLWRP5gep0RN23/4lW1d1hdt4d9l3x+MXX40xnB1nffI/nL3o6Pa0ahnMhBoCSkHhMxBrI4N1AMhnLRELwKBfCdSNkaywI4fBIKNaKOA6EhABQo6pGhPLTLwUc/fkZutZWUEQlU2XR0ZZCR3sKnqdoabayZHGCh76fRP81HyIUVTUgqRf7PK1ruqfVDXf15OkCb94q88FQ8KK6a9dLfJwPuXOPSyczqG8vH9G8GypJNQDk+kBZrIFUVYqcu1BC64IEnhUVm7fmsb3HRUtTDLU1FuculNDc6EhuLJTb/wQCQBySaG9LIpEAxp8o3luawtBwgM41oyiVCWuBP/t9HP+xHu1tSXz5zQSWvpNC64I4lAqJoojGCK78UYYfEIsWxrG6axRNjTEYI+i7WkLgEx91VaBnRxanz5SwZHEc89+IQRUQVaUqYa3B8EiI9R+PYWg4xA+HX8NfAz6+/W4Kla8YeCXFyg/S2L+3Fo4VRJHCGIEhhdYa/n074IrVo1z1YRqXfm/AorcSKEwRh76qRUWFYN/uGjwYCrFq3SgLBaUxhoDQqKoAlAMHJyWdhmz6LMNlnQ9x7HgRmVcNkklB3lWEIfB6XYyXLnvSe7YoIpQoUjHGGAUArww+nSLv3w9l765arnw/Bb9MKIHPe7J4tyNJpYq1loUCCQggojIdkdZAfz1ZlI2f/IuGBgdda9JiLXCq10MsZtC5IgXPI44cK9IY4MTRejTOj5GEEZIugCyg6D1b5onfiggDoKXZkdY34/B9YuCGj4ePIlZXW2zorsTCVkcAAwDjeI7zDI0vo/t/o8/JzZHs/g8akjdG32H2lQAAAABJRU5ErkJggg=="

# unicode -> utf-8
bytesString = img_base64_in.encode(encoding="utf-8")

# base64 解码
data = base64.b64decode(bytesString)

# 使用 matplotlib 展示图片
import matplotlib.pyplot as plt  # plt 用于显示图片
import matplotlib.image as mpimg  # mpimg 用于读取图片

# 读取BytesIO字节流
from io import BytesIO
bytes_stream = BytesIO(data)
lena = mpimg.imread(bytes_stream)

plt.figure(figsize=(1, 1))
plt.imshow(lena)  # 显示图片
plt.title('title')
plt.axis('off')  # 不显示坐标轴
plt.show()