引言:最近做爬虫的时候,解析对方网站中自定义字体时遇到的base64解码问题,对这个一直不理解,今天学习一下,总结一下。
base64
Base64是一种任意二进制到文本字符串的编码方法,基于64个可打印字符来表示二进制数据的方法。
- 例如迅雷的下载链接就就行了base64编码。
- 迅雷专用地址:
thunder://QUFodHRwOi8vc29zb2J0LmNvbS9aWg==
- 真是文件下载链接:
http://sosobt.com/
简述
Base64编码就是从二进制到字符的过程。
采用Base64编码具有不可读性,需要解码后才能阅读。
标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的/
和+
字符变形为形如"%xx"的形式。
Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
优点: 速度快,ascii字符,肉眼不可理解
缺点: 编码比较长,非常容易被破解,仅适用于加密非关键信息的场合
原理
用一句话概述就是:把3字节的二进制数据编码成4字节的文本数据。
- 如果编码的二进制数据不是3的倍数,最后剩下1个或2个字节的时候,用
\x00
字节在末尾补足后,再在编码的末尾加上1或2个=
号,表示补了多少字节,解码的时候会自动去掉。
内存一个字节占8位。
转之前:s13
转为ascii:115 49 51
转为二进制:01110011 00110001 00110011
6位为一组(4组):011100 110011 000100 110011
高位补0(一组八位):00011100 00110011 00000100 00110011
得出10进制:28 51 4 51
查表找出对应字符:c z E z
Python中的base64
需要import base64
这个module,
该module中有6个函数用于Base64的编码和解码,分成三组来说:
base64.b64decode(s, altchars=None, validate=False)
解码
base64.b64encode(s, altchars=None)
编码
altchars
参数必须是长度为2的字节包,会用于替换编码后数据中的+
和/
。
validate
参数默认为False,如果为True,在解码前会检验s中是否有非base64字母表中的字符,如果有的话,报错。
base64.standard_b64encode(s)
base64.standard_b64decode(s)
这一组方法分别对应上一组方法(相当于b64decode(s)、b64encode(s))
base64.urlsafe_b64decode(s)
base64.urlsafe_b64encode(s)
该组编码后会将输出数据中的’+’和’/’替换为’-‘和’’。解码前则将数据中的’-‘和’’替换为’+’和’/’。(适合在URL中用)
参考资料