python3 base64解码出现TypeError:Incorrect padding
今天在解决爬虫对加密参数的分析时,需要使用到base64解码。但是过程中出现了TypeError:Incorrect padding的错误提示。以下是解决方法,以便查阅。
其实正常使用base64是不会出现问题的,就比如下面的代码。
#!usr/bin/env python
# coding:utf- import base64 a = b'hello'
b = base64.b64encode(a)
# 对a进行base64编码
print(b) # b'aGVsbG8='
# 对b进行base64解码,也就是把a编码过的内容解码
c = base64.b64decode(b)
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
解决方法如下:
#!usr/bin/env python
# coding:utf-8 import base64 a = b'aGVsbG8'
missing_padding = 4 - len(a) % 4
if missing_padding:
a += b'=' * missing_padding
b = base64.b64decode(a)
print(b) # b'hello'
这样问题就解决了,其实就是在后面加等号。而missing_padding计算的就是等号的个数。如果你算出了=号的数量,直接加=号也是可以的。比如下面的代码:
#!usr/bin/env python
# coding:utf-8 import base64
import chardet a = b'aGVsbG8'
c = base64.b64decode(a + b'=')
print(c) # b'hello'
至于计算是怎么来的,需要了解下base64的原理。用一个等式表示就是,3x8 = 4x6,也就是,以前能存3字节的,现在能存4字节,只不过把原先的位bit进行了分割,而且每一个字节是用6位来表示。因为分割后的每一个字节只有6位了,不足的两位就以0来填充。而且这4个字节可以看做是一个整体,base64解码后的bytes长度至少为4且为4的倍数,不足部位以‘=’填充。
听的很迷糊?其实是我表达的不好,而且懒得画图。还是看代码:
#!usr/bin/env python
# coding:utf-8 import base64 # 原始1x8 =8位
a = b'h'
# base64编码后 8 / 6 = 1 余2,所以至少需要2个字节位,为了满足能被4整除,需要补充两个=号
b = base64.b64encode(a)
print(b) # b'aA==' # 把编码后的结果处理一下,去掉‘=’号
c = b.decode('utf-8').rstrip('=')
# 对结果进行解码,前面已经算出需要2个=号了,直接加上就好
d = base64.b64decode(c.encode('utf-8') + b'=' * 2)
# 还原结果
print(d) # b'h'
这样就一目了然了,关于base64引发异常总结就到这里。
python3 base64解码出现TypeError:Incorrect padding的更多相关文章
- Python解码base64遇到Incorrect padding错误
Python解码base64遇到Incorrect padding错误 base64转码过程 先说一下转换过程,详细的可以参考阮一峰.廖雪峰博客: 所谓Base64,就是说选出64个字符----小写字 ...
- python base64 decode incorrect padding错误解决方法
个人觉得原因应该是不同的语言/base64库编码规则不太统一的问题. python中base64串的长度需为4的整数倍,故对长度不为4整数倍的base64串需要用"='补足 如下代码: da ...
- python3 base64模块代码分析
#! /usr/bin/env python3 """Base16, Base32, Base64 (RFC 3548), Base85 and Ascii85 data ...
- C# Base64解码 二进制输出
具体的:Base64编码解码还需要学习 /// <summary> /// base64 解码Excel下载 /// </summary> /// <param name ...
- 微信小程序之图片base64解码
不知道大家在做微信小程序的时候遇到base64解码的问题,我之前在做微信小程序的时候遇到base64解析图片一直有问题,所以在这里把遇到的问题和解决方案在这里记录一下: 在平时的项目中我们是直接用ba ...
- 将图片文件转化为字节数组字符串,并对其进行Base64编码处理,以及对字节数组字符串进行Base64解码并生成图片
实际开发中涉及图片上传并且量比较大的时候一般处理方式有三种 1.直接保存到项目中 最老土直接方法,也是最不适用的方法,量大对后期部署很不方便 2.直接保存到指定路径的服务器上.需要时候在获取,这种方式 ...
- SqlServer Base64解码中文
最近在做一个和拥有TurboCRM相关的项目,其中需要取出客户信息的联系人字段,经过查看,这个字段在存入时用Base64加密过了 这个功能在应用层实现是很方便的,但是由于一些特殊原因,只能放到SqlS ...
- 3 python3 编码解码问题 upd接受数据
1.python3下的中文乱码:send_data.encode("utf-8") from socket import * udp_socket = socket(AF_INET ...
- 【java工具类】对字节数组字符串进行Base64解码并生成图片
import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import org.springfra ...
随机推荐
- BZOJ4476 JSOI2015送礼物(分数规划+单调队列)
看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...
- hdu 3500 Fling (dfs)
Fling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submi ...
- [CF620E]New Year Tree
题目大意:有一棵以$1$为根的有根树,有$n$个点,每个节点初始有颜色$c_i$.有两种操作: $1 v c:$将以$v$为根的子树中所有点颜色更改为$c$ $2 v:$ 查询以$v$为根的子树中的节 ...
- 【NOIP模拟赛】公主的朋友 区间染色问题
这道题大家都用的分块,然而我发现这是一个经典算法:区间染色问题. 我们区间染色时把区间分成若干连续的颜色段,然后我们每次染色删除原来的颜色段插入新的颜色段. 我们发现我们的时间复杂度直接与我们要染色区 ...
- java禁止实例化的工具类
public class Q { /** * @param args */ public static void main(String[] args) { new Person() } } clas ...
- ng 构建
1.ng 构建和部署 构建:编译和合并ng build 部署:复制dist里面的文件到服务器 2.多环境的支持 配置环境package.json "scripts": { &quo ...
- Create a conditional DNS forwarder on our domain.com to Amazon default DNS provider
Backgroup: I have an AWS Managed Active Directory(domain.com). I created a DHCP options set to my d ...
- maven工程开启jetty调试
转摘自:http://czj4451.iteye.com/blog/1942437 准备工作: a. 在pom.xml中配置jetty插件: <plugins> <plugin> ...
- SHOI 2007 仙人掌图(BZOJ 1023)
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2564 Solved: 1062 Descrip ...
- bzoj 2330 SCOI2011糖果 查分约束系统
就根据题目中给的约束条件建图就行了 需要注意的是,我们要做的是最长路,因为需要约束每个点都是大于0 那么可以建一个超级源指向所有点,超级源的dis是1,边长为0 那么这样做最长路就可以了 好了我们这么 ...