Python base64模块编码和解码(附带实例)
在某些系统中只能使用 ASCII 字符。Base64 就是用来将非 ASCII 字符的数据转换为 ASCII 字符数据的一种方法,特别适用于 HTTP 和 MIME 协议下快速传输数据。
Base64 首先要求把每 3 个 8bit 的字节转换为 4 个 6bit 的字节(3×8=4×6=24),然后把 6bit 字节的高两位添 0,组成 4 个 8bit 的字节。也就是说,转换后的字符串在理论上要比原来的长 1/3。
比如,有 3 个字节的原始数据:
Python 提供了 base64 模块进行 Base64 编码、解码,常用的方法有 b64encode()、b64decode()、urlsafe_b64encode()、urlsafe_b64decode() 等。
下面将在 Python 解释器中体验一下编码、解码的操作,即:
需要注意的是,Python3 需要使用 encode() 转换为 bytes。UHl0aG9uIElvdA== 就是 Base64 编码,使用 b64decode() 解码,通过 decode() 将 bytes 转换为字符串后,得到原始的数据。
另外,由于在标准的 Base64 编码后可能出现字符加号(+)和斜杠(/),+ 和 / 在 URL 中不能直接作为参数,因此 Python 的 base4 模块提供了:
测试代码为:
Base64 首先要求把每 3 个 8bit 的字节转换为 4 个 6bit 的字节(3×8=4×6=24),然后把 6bit 字节的高两位添 0,组成 4 个 8bit 的字节。也就是说,转换后的字符串在理论上要比原来的长 1/3。
比如,有 3 个字节的原始数据:
aaaaaabb bbbbccccc ccdddddd
那么编码之后会变成:00aaaaaa 00bbbbbb 00cccccc 00dddddd
如果要编码的二进制数据不是 3 的倍数,则最后剩下 1 个或 2 个字节怎么办呢?Base64 先用 \x00 字节在末尾补足,再在编码的末尾加上 1 个或 2 个等号(=),表示补了多少个字节,解码的时候,等号会自动被去掉。Python 提供了 base64 模块进行 Base64 编码、解码,常用的方法有 b64encode()、b64decode()、urlsafe_b64encode()、urlsafe_b64decode() 等。
下面将在 Python 解释器中体验一下编码、解码的操作,即:
>>> import base64 >>> str = 'Python lot' >>> en = base64.b64encode(str.encode()) >>> print(en) b'UHI0aG9uIElvdA ==' >>> print(en.decode()) UHI0aG9uIElvdA == >>> de = base64.b64decode(en) >>> print(de) b'Python lot' >>> print(de.decode()) Python lot首先导入 base64 模块,然后定义一个字符串,使用 b64encode 将其编码为 Base64。
需要注意的是,Python3 需要使用 encode() 转换为 bytes。UHl0aG9uIElvdA== 就是 Base64 编码,使用 b64decode() 解码,通过 decode() 将 bytes 转换为字符串后,得到原始的数据。
另外,由于在标准的 Base64 编码后可能出现字符加号(+)和斜杠(/),+ 和 / 在 URL 中不能直接作为参数,因此 Python 的 base4 模块提供了:
- urlsafe_b64encode() 方法将 + 和 / 分别转换为横杠(-)和下画线(_);
- urlsafe_b64decode() 方法将 - 和 _ 分别转换为 + 和 /。
测试代码为:
>>> import base64 >>> base64.b64encode(b'i\xb7\x1d\xfb\xef\xff') b'abcd++//' >>> en_url = base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff') >>> print(en_url) b'abcd--_' >>> de_url = base64.urlsafe_b64decode(en_url) >>> print(de_url) b'i\xb7\x1d\xfb\xef\xff'