擅长:python、mysql、java
<p>“不正确的填充”不仅意味着“缺少填充”,而且(信不信由你)“不正确的填充”。</p>
<p>如果建议的“添加填充”方法不起作用,请尝试删除一些尾随字节:</p>
<pre><code>lens = len(strg)
lenx = lens - (lens % 4 if lens % 4 else 4)
try:
result = base64.decodestring(strg[:lenx])
except etc
</code></pre>
<p>更新:在添加填充或从结尾删除可能不正确的字节时,应在删除任何空白之后进行任何修改,否则长度计算将被破坏。</p>
<p><strong>如果您向我们展示一个(简短的)您需要恢复的数据样本,这将是一个好主意。编辑您的问题并复制/粘贴</strong><code>print repr(sample)</code>的结果。</p>
<p>更新2:编码可能是以url安全的方式完成的。如果是这种情况,您将能够在数据中看到减号和下划线字符,并且应该能够使用<code>base64.b64decode(strg, '-_')</code>对其进行解码</p>
<p>如果您在数据中看不到减号和下划线字符,但可以看到加号和斜杠字符,那么您就有其他问题,可能需要添加填充或删除cruft技巧。</p>
<p>如果在数据中看不到减号、下划线、加号和斜杠,则需要确定两个替代字符;它们将是[A-Za-z0-9]中没有的字符。然后,您需要进行实验,看看它们在<code>base64.b64decode()</code>的第2个参数中需要使用的顺序</p>
<p><strong>更新3</strong>:如果您的数据是“公司机密”:<br/>
(a) 你应该事先这么说<br/>
(b) 我们可以探索其他途径来理解这个问题,它很可能与使用什么字符而不是编码字母表中的<code>+</code>和<code>/</code>或其他格式或无关字符有关。</p>
<p>其中一种方法是检查数据中有哪些非“标准”字符,例如</p>
<pre><code>from collections import defaultdict
d = defaultdict(int)
import string
s = set(string.ascii_letters + string.digits)
for c in your_data:
if c not in s:
d[c] += 1
print d
</code></pre>