Python 可以使用 base64 来处理字符编码问题,Base64 是一种用 64 个字符表示任意二进制数据的方法。
用记事本打开exe、jpg、pdf等文件时,我们会看到很多乱码,因为二进制文件中包含很多无法显示和打印的字符。因此,如果要制作记事本等文本处理软件来处理二进制数据,就需要一种二进制转字符串的方法。 Base64 是最常见的二进制编码方法之一。
Base64的原理很简单。首先,准备一个包含 64 个字符的数组:
['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
然后,处理二进制数据,每组3个字节,一共3x8=24bit,分成4组,每组正好是6位
这样,我们得到4个数字作为索引,然后查表得到对应的4个字符,也就是编码后的字符串。
所以Base64编码会将3字节的二进制数据编码成4字节的文本数据,长度会增加33%。优点是编码后的文本数据可以直接显示在邮件正文、网页等中。
如果要编码的二进制数据不是3的倍数,最后会剩下1或2个字节怎么办? Base64在末尾补了\x00字节后,在编码末尾加1或2=符号表示补了多少字节。解码时会自动删除。
Python内置的base64可以直接进行base64的编解码:
>>> import base64
>>> base64.b64encode('binary\x00string')
'YmluYXJ5AHN0cmluZw=='
>>> base64.b64decode('YmluYXJ5AHN0cmluZw==')
'binary\x00string'
由于字符 + 和 / 可能出现在标准 Base64 编码之后,因此不能直接作为 URL 中的参数,因此还有另一种“url 安全”的 base64 编码,实际上是将字符 + 和 / 分别变成 - 和 _:
>>> base64.b64encode('i\xb7\x1d\xfb\xef\xff')
'abcd++//'
>>> base64.urlsafe_b64encode('i\xb7\x1d\xfb\xef\xff')
'abcd--__'
>>> base64.urlsafe_b64decode('abcd--__')
'i\xb7\x1d\xfb\xef\xff'
也可以自己定义 64 个字符的排列顺序,这样就可以自定义 Base64 编码,但是通常完全没有必要。
Base64 是一种使用查找表的编码方式,不能用于加密,即使使用自定义编码表也是如此。
Base64 适用于对小块内容进行编码,例如数字证书签名、cookie 内容等。
由于 = 字符也可能出现在 Base64 编码中,但在 URL 和 cookie 中使用 = 会导致歧义。因此,许多 Base64 编码将删除 =:
# 标准Base64:
'abcd' -> 'YWJjZA=='
# 自动去掉=:
'abcd' -> 'YWJjZA'
删除=后如何解码?因为Base64把3个字节变成了4个字节,所以Base64编码的长度总是4的倍数。所以需要加=,把Base64字符串的长度变成4的倍数,就可以正常解码了。 .
请写一个能处理去掉=的base64解码函数:
>>> base64.b64decode('YWJjZA==')
'abcd'
>>> base64.b64decode('YWJjZA')
Traceback (most recent call last):
...
TypeError: Incorrect padding
>>> safe_b64decode('YWJjZA')
'abcd'
小结
Base64 是一种任意二进制转文本字符串编码方法,常用于在 URL、cookie 和网页中传输少量二进制数据。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python输出结果乱码怎么办?11/11
- ♥ Python小白福利的基本数据类型11/11
- ♥ Python判断xml中是否存在某个节点?09/24
- ♥ python语言流行吗?12/14
- ♥ Elasticsearch与Python的对接实现01/13
- ♥ 统计一篇文章中某个字符在字符串中出现的频率12/27
内容反馈