由于看到hashlib模块中加密方法的应用。顺便也看了下常见的base64模块。
首先base64是将二进制文件转成字符串的一种编码方式。
因为二进制文件包含无法显示和输出的字符。但我们需要处理这些二进制数据,却出现了无法显示,乱码的问题,这时候便出现了base64编码,它将二进制数据编码成字符串,让我们能进行处理二进制文件。
base64编码基本原理:
将二进制数据分成3字节一组,也就是说一组会有24bit,再将24bit分成4组,每组6bit。我们将4个数字作为索引,查对应的表,获得相应的4个字符,完成编码。
当二进制不是3的倍数时,剩下1个或者两个字节时,Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。
这样就可以愉快的处理无法显示和输出的容易乱码的二进制文件了。
base64模块基本使用:
import base64
>>>base64.b64encode(b'binary\x00string')#将二进制数据进行编码
>>>base64.b64decode(b'YmluYXJ5AHN0cmluZw==')#解码
编码后的样子:YmluYXJ5AHN0cmluZw==
问题又来了,base64虽然能将二进制数据变得可见可处理,可是在编码后有时候会有+和/,这编码后的字符串无法在url参数中得到应用(产生原因),所以产生了url safe的base64编码:
>>> base64.b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd++//
>>> base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')
b'abcd--__'
>>> base64.urlsafe_b64decode('abcd--__')
b'i\xb7\x1d\xfb\xef\xff'
将+,/转换成了-,__,从而解决了上述问题。
往往base64出现不足3字节,会出现=来表示补位个数,但是=的出现在url,cookies中也会造成歧义,所以很多时候base64编码后会把=去掉。