首页 > 编程笔记 > Python笔记 阅读:28

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 个字节的原始数据:

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 模块提供了:
测试代码为:
>>> 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'

相关文章