我认为我的问题非常简单。我需要解码Base64直到没有Base64,如果有一些Base64,我用RegEx检查但是我不知道在没有Base64之前如何解码。
在这个简短的代码中,我可以对Base64进行解码,直到没有Base64,因为我的Text是定义的。 (直到Base64 Decode Stuff不是“Hello World”解码)
# Import Libraries
from base64 import *
import re
# Text & Base64 String
strText = "Hello World"
strEncode = "VmxSQ2ExWXlUWGxUYTJoUVVqSlNXRlJYY0hOT1ZteHlXa1pLVVZWWE9EbERaejA5Q2c9PQo=".encode("utf-8")
# Decode
objRgx = re.search('^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$', strEncode.decode("utf-8"))
strDecode = b64decode(objRgx.group(0).encode("utf-8"))
print(strDecode.decode("utf-8"))
while strDecode != strText.encode("utf-8"):
strDecode = b64decode(strDecode)
print(strDecode.decode("utf-8"))
有没有人知道如何解码Base64,直到有真实文本(不再是base64)
P上。对不起我的英语不好。
答案 0 :(得分:6)
你不能,不能在任意意义上。问题很简单就是正常,每天的单词也可以是BASE64。所以,没有真正的方法来区分两者之间的区别。
BASE64没有长度以外的终结符。它可以用=或==终止,但不能终止。 =只是填充。不需要填充,然后没有=。因此BASE64可能会结束并且一些文本将开始,而您无法检测到它。
编辑“所以真的没办法做我想要的事情吗?”:
不,不是确定性的,不可靠的。即使使用启发式方法,也有可能出现失败的情况,最终会消耗太多字符,导致二进制块结尾处出现垃圾,以及后续文本流中的字符丢失。
现在这是针对任意BASE64块的。如果你知道二进制数据是什么,那么也许是希望。
例如,如果你知道二进制数据是什么,大多数二进制格式“知道”它们何时“完成”。我不知道有效的二进制格式是“读到EOF”。它们通常包含内部描述符“这是下一个块有多少数据”或终结者说“我已经完成”。
在这些情况下,您可以将BASE64视为流。 BASE64基本上非常简单。它需要3个字节并将它们转换为4个字符。
因此,B64流读取器需要简单地读取4个字符并返回它们代表的3个字节。
如果你有一个PNG阅读器,它可以开始读取转换后的流。当它“完成”时,它“关闭”流,你的原始文本“在BASE64的末尾”。
如果您知道原始附件的大小,它也可以工作。如果有人发送“10,000字节”,那么您使用BASE64流解码器并从中读取“10,000”字节。
通常情况下,您将使用带有=或==终止符的BASE64。在这种情况下,你不会这是一个问题。解码的流可以任意方式工作。
如果您不知道附件的原始大小或编码二进制文件的格式,那么您将非常幸运。
答案 1 :(得分:2)
作为启发式,您可以计算结果中的平均字长。自然语言会有短语,例如“作为启发式,你可以看一下单词长度。”仍然是Base64编码的字符串将在空格之间具有很少的空格和长字符串。
作为另一种启发式方法,您可以计算元音(a,e,i,o,u)与辅音的比例或单词中间的大写字母数。
答案 2 :(得分:0)
因此,您正在处理可能已重复进行base64编码的数据块?为什么不通过b64decode()循环字符串直到它出错,然后呢?
此外,我认为您可能不需要花费很多.encode("utf-8")
左右。
答案 3 :(得分:0)
我在这里看到两个有价值的答案,指的是平均字长(Mark Lutton)和原始数据的字节大小(Will Hartung)。另一个有用的事情:寻找预期的词典单词,有意义的数字或/和日期。