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个=号,表示补了多少字节,解码的时候,会自动去掉。
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)
1
2
3
4
5
6
7
8
9
10
11
由于标准的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)
1
2
3
4
5
6
7
注意:无论是哪种编码方式,输入到base64中的参数都是字节的形式,因此上方中参数byte_str前有个b
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()