我有一些经过Base64编码的数据,即使其中存在填充错误,我也想将其转换回二进制。如果我使用
base64.decodestring(b64_string)
它引发了一个“填充不正确”的错误。还有其他方法吗?
更新:感谢所有的反馈。老实说,提到的所有方法听起来都有点靠运气,所以我决定尝试openssl。以下命令非常有效:
openssl enc -d -base64 -in b64string -out binary_data
如果引发异常,则
i. 通过try/except捕获它,
ii. (R?)从输入数据中删除任何=字符(注意:这可能不是必需的),
iii. 在输入数据中添加A==(A==到P==都可以),
iv. 使用那些A==-附加的输入数据调用base64.b64decode(...)。
即使出现损坏,我仍然希望回到二进制文件,因为我仍然可以从ASN.1流中获取一些有用的信息。")。
请参阅下面的我们所知道的和假设。
概括:
通过对 base64.b64decode(...) 的一些快速测试,看起来它会忽略非[A-Za-z0-9+/]字符;这包括忽略 =s,除非它们是在四个解析组的末尾字符,此时 =s 终止解码 (a=b=c=d= 与 abc= 的结果相同,a==b==c== 与 ab== 的结果相同)。
另外,所有附加的字符在 base64.b64decode(...) 终止解码后都被忽略,例如在第四个组中的 =。
正如上面的一些评论所指出的那样,当[到目前为止解析的字符数模4]值为0、3或2时,输入数据末尾需要填充零个、一个或两个"="。因此,从上述第3和第4项中可以得知,在这些情况下将两个或更多的"="附加到输入数据中将会纠正任何[不正确的填充]问题。我们从OP和后续评论中所知道的是
openssl enc ...
可以工作。假设
Github
这里是一个包装器来实现这个解决方案:
base64.urlsafe_b64decode()
。b64decode(f"{s}{'=' * (4 - len(s) % 4)}")
我在没有使用base64的情况下遇到了这个错误。所以我找到了一个解决方案,就是错误出现在本地主机上,但在127.0.0.1上运行良好。
def base64_decode(data: str) -> str:
data = data.encode("ascii")
rem = len(data) % 4
if rem > 0:
data += b"=" * (4 - rem)
return base64.urlsafe_b64decode(data).decode('utf-8')
您应该使用
base64.b64decode(b64_string, ' /')
'+/'
。dHJhaWxlcgo8PCAvU2l6ZSAxNSAvUm9vdCAxIDAgUiAvSW5mbyAyIDAgUgovSUQgWyhcMDAyXDMz
MHtPcFwyNTZbezU/VzheXDM0MXFcMzExKShcMDAyXDMzMHtPcFwyNTZbezU/VzheXDM0MXFcMzEx
KV0KPj4Kc3RhcnR4cmVmCjY3MDEKJSVFT0YK
--_=ic0008m4wtZ4TqBFd+sXC8--
当我删除了--_=ic0008m4wtZ4TqBFd+sXC8--
并剥离字符串后,解析问题得到了修复。
因此,我的建议是确保您解码的是正确的base64字符串。
missing_padding = len(data) % 4
if missing_padding == 3:
data = data[0:-3]
elif missing_padding != 0:
print ("Missing padding : " + str(missing_padding))
data += '=' * (4 - missing_padding)
data_decoded = base64.b64decode(data)
只需添加额外的字符,如“=”或其他任何字符,并使其成为4的倍数,然后再尝试解码目标字符串值。就像这样;
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)
base64.b64decode(strg, '-_')
?在你没有提供任何示例数据的情况下,这是解决你问题最有可能的Python方法。之前提出的"方法"只是调试建议,鉴于提供的信息很少,它们必然是"靠瞎猜"的。 - John Machinbase64.urlsafe_b64decode(s)
。该函数用于解码使用URL安全字符集编码的Base64字符串。 - Daniel Fsorted(list(set(b64_string)))
。通过此方式,我们可以知道用于编码原始数据的字符集,进而提供一个更加准确的解决方案,同时不会泄露任何公司机密信息。 - Brian Carcich