python3 base64解码出现TypeError:Incorrect padding,python3typeerror, 今天在解决爬虫
python3 base64解码出现TypeError:Incorrect padding,python3typeerror, 今天在解决爬虫
今天在解决爬虫对加密参数的分析时,需要使用到base64解码。但是过程中出现了TypeError:Incorrect padding的错误提示。以下是解决方法,以便查阅。
其实正常使用base64是不会出现问题的,就比如下面的代码。
1 #!usr/bin/env python 2 # coding:utf-8 3 4 import base64 5 6 a = b‘hello‘ 7 b = base64.b64encode(a) 8 # 对a进行base64编码 9 print(b) # b‘aGVsbG8=‘10 # 对b进行base64解码,也就是把a编码过的内容解码11 c = base64.b64decode(b)12 print(c) # b‘hello‘
上面代码的编码结果是完整的,所以直接解码出来没有问题。如果编码结果不完整,比如上面代码中如果给定的bytes对象的值是b‘aGVsbG8‘ ,就会出现TypeError:Incorrect padding异常提示。比如下面的代码就报错了。
#!usr/bin/env python# coding:utf-8import base64a = b‘aGVsbG8‘b = base64.b64decode(a)print(b) #binascii.Error: Incorrect padding
解决方法如下:
1 #!usr/bin/env python 2 # coding:utf-8 3 4 import base64 5 6 a = b‘aGVsbG8‘ 7 missing_padding = 4 - len(a) % 4 8 if missing_padding: 9 a += b‘=‘ * missing_padding10 b = base64.b64decode(a)11 print(b) # b‘hello‘
这样问题就解决了,其实就是在后面加等号。而missing_padding计算的就是等号的个数。如果你算出了=号的数量,直接加=号也是可以的。比如下面的代码:
1 #!usr/bin/env python2 # coding:utf-83 4 import base645 import chardet6 7 a = b‘aGVsbG8‘8 c = base64.b64decode(a + b‘=‘)9 print(c) # b‘hello‘
至于计算是怎么来的,需要了解下base64的原理。用一个等式表示就是,3x8 = 4x6,也就是,以前能存3字节的,现在能存4字节,只不过把原先的位bit进行了分割,而且每一个字节是用6位来表示。因为分割后的每一个字节只有6位了,不足的两位就以0来填充。而且这4个字节可以看做是一个整体,base64解码后的bytes长度至少为4且为4的倍数,不足部位以‘=’填充。
听的很迷糊?其实是我表达的不好,而且懒得画图。还是看代码:
1 #!usr/bin/env python 2 # coding:utf-8 3 4 import base64 5 6 # 原始1x8 =8位 7 a = b‘h‘ 8 # base64编码后 8 / 6 = 1 余2,所以至少需要2个字节位,为了满足能被4整除,需要补充两个=号 9 b = base64.b64encode(a)10 print(b) # b‘aA==‘11 12 # 把编码后的结果处理一下,去掉‘=’号13 c = b.decode(‘utf-8‘).rstrip(‘=‘)14 # 对结果进行解码,前面已经算出需要2个=号了,直接加上就好15 d = base64.b64decode(c.encode(‘utf-8‘) + b‘=‘ * 2)16 # 还原结果17 print(d) # b‘h‘
这样就一目了然了,关于base64引发异常总结就到这里。
python3 base64解码出现TypeError:Incorrect padding
相关内容
- python3 print输出时会有空行的问题及解决方法,python3p
- python-day7--%s与%d的使用,python2中的input及raw_input,,#co
- python3对接聊天机器人API,python3聊天机器人,详情见htt
- python while 循环打印九九乘法表,pythonwhile,方向一i = 1
- python中的作用域以及内置函数globals()-全局变量、local
- python 一个包中的文件调用另外一个包文件 实例,py
- python requests请求指定IP的域名,pythonrequests,不需要修改
- python 读取大文件越来越慢(判断 key 在 map 中,千万别
- Python进阶-----使用ininstance和issublcass方法判断类和对象的
- python 模拟事件触发机制,python事件触发机制,EventManag
评论关闭