一、基本概念
Base64是一种用64个字符来表示任意二进制数据的方法。使用的64个字符包括大小写字母、数字、加号+、斜杠/等,补位用等号=。
Base64编码具有不可读性和可逆性,常用于电子邮件、HTTP协议中的传输字符防止出现特殊字符和编码问题。因为Base64编码后的字符串只包含ASCII字符,所以能够被所有邮件系统支持。
下面是将data字符串使用Base64编码的例子:
import base64 data = b'hello world' encoded_data = base64.b64encode(data) print(encoded_data) # b'aGVsbG8gd29ybGQ='
二、编码过程
Base64编码的过程可以分为以下几步:
- 将需要编码的字符串转换为二进制数据
- 将二进制数据每6位一分组,不足6位的在后面补0
- 将每组转换为对应的Base64字符
- 对于每组不足6位的在后面补等号=,表示补完0的位数,原本的数据不含有等号
具体来说,假设需要编码的字符串为data,将data转换为二进制数据后分组:
import base64 data = b'hello world' binary_data = ''.join(format(x, '08b') for x in data) binary_group = [binary_data[i:i+6] for i in range(0, len(binary_data), 6)] print(binary_group) # ['011010', '010010', '011011', '110011', '011011', '000101', '011110', '011000']
然后将每个分组转换为对应的Base64字符:
mapping = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' base64_group = [mapping[int(x, 2)] for x in binary_group] print(base64_group) # ['a', 'S', '1', 'z', '1', 'F', 'e', 'g']
补等号的过程如下:
padding = len(binary_group[-1]) % 6 if padding > 0: base64_group[-1] += '=' * (6 - padding) print(''.join(base64_group)) # 'aGVsbG8gd29ybGQ='
三、解码过程
解码过程和编码过程基本相反,可以分为以下几步:
- 将Base64字符转换为对应的二进制数据
- 将二进制数据合并
- 将合并的二进制数据转换为原字符串
下面是将aGVsbG8gd29ybGQ=使用Base64解码的例子:
import base64 encoded_data = b'aGVsbG8gd29ybGQ=' decoded_data = base64.b64decode(encoded_data) print(decoded_data) # b'hello world'
四、应用场景
Base64编码常用于以下场景中:
- 电子邮件:电子邮件中不能直接传输二进制文件,需要将二进制数据编码为ASCII字符后传输
- HTTP协议:HTTP协议中的请求头和响应头不能出现特殊字符,需要将二进制数据编码为ASCII字符后传输
- 数据存储:比如将二进制数据存储到数据库或配置文件中
下面是将图片使用Base64编码后在HTML中显示的例子:
import base64 with open('example.jpg', 'rb') as f: data = f.read() encoded_data = base64.b64encode(data).decode('ascii') html = '<img src="data:image/jpeg;base64,%s">' % encoded_data print(html)
在使用上述代码后,可以将生成的html代码复制到浏览器的地址栏中查看对应的图片。