python3 base64解码出现TypeError:Incorrect padding

Posted 月见空青

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3 base64解码出现TypeError:Incorrect padding相关的知识,希望对你有一定的参考价值。

      今天在解决爬虫对加密参数的分析时,需要使用到base64解码。但是过程中出现了TypeError:Incorrect padding的错误提示。以下是解决方法,以便查阅。

      其实正常使用base64是不会出现问题的,就比如下面的代码。

 1 #!usr/bin/env python
 2 # coding:utf-8
 3 
 4 import base64
 5 
 6 a = bhello
 7 b = base64.b64encode(a)
 8 # 对a进行base64编码
 9 print(b)  # baGVsbG8=
10 # 对b进行base64解码,也就是把a编码过的内容解码
11 c = base64.b64decode(b)
12 print(c)  # bhello

       上面代码的编码结果是完整的,所以直接解码出来没有问题。如果编码结果不完整,比如上面代码中如果给定的bytes对象的值是b‘aGVsbG8‘ ,就会出现TypeError:Incorrect padding异常提示。比如下面的代码就报错了。

#!usr/bin/env python
# coding:utf-8

import base64

a = baGVsbG8
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 = baGVsbG8
 7 missing_padding = 4 - len(a) % 4
 8 if missing_padding:
 9     a += b= * missing_padding
10 b = base64.b64decode(a)
11 print(b) # b‘hello‘

       这样问题就解决了,其实就是在后面加等号。而missing_padding计算的就是等号的个数。如果你算出了=号的数量,直接加=号也是可以的。比如下面的代码:

1 #!usr/bin/env python
2 # coding:utf-8
3 
4 import base64
5 import chardet
6 
7 a = baGVsbG8
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 = bh
 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的主要内容,如果未能解决你的问题,请参考以下文章

Python 中 base64 编码与解码

python3url编解码base64编解码ASE加解密

Django 2、python 3.4 无法解码 urlsafe_base64_decode(uidb64)

Python和Mysql:base64编码和解码字符串,短信sms解码

Android中使用commons-codec-1.6.jar 进行Base64编解码出现的问题

快速从 Base64 格式解码