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 = 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-8

import base64

a = 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_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 = 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引发异常总结就到这里。

原文地址:https://www.cnblogs.com/sjfeng1987/p/9195981.html

时间: 2024-10-09 08:53:03

python3 base64解码出现TypeError:Incorrect padding的相关文章

java环境下的base64解码程序设计

最近遇到一个ctf题,要求求解一个字符串经过几次base64解码可以恢复成正常的字符串.原题的字符串如下: Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTVjAxV2JETlhhMUpUVmpBeFYySkVUbGhoTVVwVVZtcEJlRll5U2tWVWJHaG9UVlZ3VlZacVFtRlRNbEpJVm10a1dHSkdjRTlaVjNSR1pVWmFkR05GU214U2JHdzFWVEowVjFaWFNraGhSemxWVmpO

Java对图片Base64转码--HTML对Base64解码

Java对图片Base64转码 package base64; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import sun.misc.BASE64Decod

发邮件 用base64解码账号密码 方便调试

有时候 需要用各种语言来发邮件. 比如我写过用PHP ,Python, 和Perl的.每个邮件都有自己的邮件模块, 略有不同. 这里要说的是 用base64来 查看 账号 密码 是否正确. 首先打开详细的错误信息, 在登陆的时候,通常会有这么一段 验证登陆 s sendEmail[1805]: DEBUG => SMTP-AUTH: Using LOGIN authentication method s sendEmail[1805]: INFO => Sending: AUTH LOGIN

base64解码

网络传输经常用base64编码的数据,因此我们需要将其解码成正常字符集合. base64.h 1 #ifdef __cplusplus 2 extern "C" { 3 #endif 4 5 char * base64_encode( const unsigned char * bindata, char * base64, int binlength ); 6 int base64_decode( const char * base64, unsigned char * bindat

在iOS中base64解码与编码

在iOS7以及以后有效: // base64编码 - (NSString*)base64encode:(NSString*)str { // 1.把字符串转成二进制数据 NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding]; // 2.将二进制进行base64加密(编码) // iOS7以后才有的方法 return [data base64EncodedStringWithOptions:0]; } // base64解码 - (

C# Base64解码 二进制输出

具体的:Base64编码解码还需要学习 /// <summary> /// base64 解码Excel下载 /// </summary> /// <param name="excelContent"></param> /// <param name="strFileName"></param> public void BidExcelDown(string excelContent, stri

Java对图片Base64转码--HTML对Base64解码 [ Java加强版 ]

Java对图片Base64编码 package base64; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Rand

python3报错:TypeError: can&#39;t concat bytes to str

有时会报错这个:TypeError: Can't convert 'bytes' object to str implicitly 解决方法:使用字节码的decode()方法. 示例: str = 'I am string' byte = b' I am bytes' s = str + byte print(s) 这时会报错:TypeError: Can't convert 'bytes' object to str implicitly 解决方法: s = str + byte.decode

bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (二) 图片裁剪

图片裁剪参见: http://deepliquid.com/projects/Jcrop/demos.php?demo=thumbnail        一个js插件 http://www.mikesdotnetting.com/article/95/upload-and-crop-images-with-jquery-jcrop-and-asp-net  一个外国人写的例子,基于 asp.net webform 的.别人 在 2009 年 写的啊,我却在 2014年 才使用. 一共2个aspx