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
if len(value) % 4 != 0: #check if multiple of 4
while len(value) % 4 != 0:
value = value + "="
req_str = base64.b64decode(value)
else:
req_str = base64.b64decode(value)
它似乎忽略了非[ A-Za-z0-9 +/]字符; 这包括忽略 = s 除非,它们是解析后的四个字符组中的最后一个字符,在这种情况下,= s 终止解码(a = b = c = d = 给出了与 abc = 相同的结果,a = = b = = c = = 给出了与 ab = = 相同的结果)。
所有字符在 base64.b64decode (...)终止解码时附加 被忽略了,例如从 an = 作为组中的第四个字符。
正如上面的一些注释所指出的,当[到该点的已解析字符数为模4]值分别为0、3或2时,在输入数据的末尾需要填充0、1或2个 = s。那么,从第三项开始。四。如上所述,在输入数据后面附加两个或更多的 = s 将纠正这些情况下的任何[不正确的填充]问题。
然而, 解码不能处理[已解析字符模块4的总数]为1的情况,因为它至少需要两个已编码字符来表示一组三个已解码字节中的第一个已解码字节。在 一损坏的编码输入数据中,这种[ N 模4] = 1的情况从未发生过,但是由于 OP 声明字符可能丢失,所以它可能发生在这里。这就是为什么简单地附加 = s 并不总是有效的原因,也是为什么附加 A = = 会有效而附加 = = 不会有效的原因。注意: 使用[ A ]几乎是任意的: 它只向解码后的文件添加清除(零)位,这可能是正确的,也可能是不正确的,但是这里的对象不是正确的,而是由 base64.b64decode (...)完成的,没有异常。