2010-10-22 64 views
1

所以我的问题是非常简单的东西,我认为。我需要解码Base64,直到没有Base64,我检查了RegEx,如果有一些Base64,但我没有想法如何解码,直到没有Base64。Base64解码,直到没有Base64

在这短代码我可以解码Base64,直到没有Base64,因为我的文本被定义。 (直到Base64编码解码东西是不是“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)

PS对不起,我如何能够解码的Base64因为我的英语不好。

+0

你的意思是你不一定知道base 64数据在哪里结束,对吗? “Du meinst,dass man nicht unbedingt wissen,wo die Basis 64 Daten enden,nicht wahr?Es tut mir leidfürmein schlechtes Deutsch。” – hughdbrown 2010-10-22 15:49:02

+0

如果这是你的问题,我发现它很混乱,因为base64数据有一个停止符'='。见:http://en.wikipedia.org/wiki/Base64“Ist das Ihre Frage,finde ich es verwirrend,weil base64 Daten hat ein Stoppzeichen,'='。” – hughdbrown 2010-10-22 15:51:21

回答

2

作为一种启发式算法,您可以计算结果中的平均字长。自然语言会有短的词,如“作为一种启发式,你可以看字长”。仍然使用Base64编码的字符串在空格之间会有很少的空格和长字符串。

作为另一种启发式算法,您可以计算元音(a,e,i,o,u)与辅音的比例或单词中间的大写字母的数量。

5

你不能,没有任何意义。问题很简单,正常,每天的话也可以是BASE64。所以,没有办法分辨两者之间的差异。

BASE64没有长度以外的终止符。它可以用=或==终止,但不必终止。该=只是填充。不需要填充,然后no =。因此,BASE64可能会结束并且一些文本将会开始,而您无法检测到它。

编辑的“所以真的没有办法做我想要什么?”:

不,不确定性,不可靠。即使采用启发式方法,也会出现潜在的失败案例,并且最终会消耗太多字符,导致二进制块结尾处出现垃圾,并丢失了以下文本流中的字符。

现在这是一个任意的BASE64块。如果你知道二进制数据是什么,那么也许有希望。例如,如果你知道二进制数据是什么,大多数二进制格式“知​​道”它们何时“完成”。我不知道一个有效的二进制格式,说“直到你到达EOF阅读”。它们通常带有内部描述符“这是下一个块有多少数据”或终止符表示“我已完成”。

在这些情况下,您可以将BASE64视为流。 BASE64基本上很简单。它需要3个字节并将它们转换为4个字符。

因此,B64流读取器需要简单地读取4个字符并返回它们所代表的3个字节。

如果你有一个PNG阅读器,它可以开始读取转换后的数据流。当它“完成”时,它“关闭”流,并且原始文本是“在BASE64的末尾”。

它也可以工作,如果你知道原始附件的大小。如果有人发送了“10,000字节”,那么你使用BASE64流解码器并简单地从它读取“10,000”字节。

通常情况下,您将拥有带= =或==终止符的BASE64。这是你不认为这是一个问题的情况。流解码工作的方式。

如果您不知道附件的原始大小或编码二进制的格式,那么您几乎不走运。

+0

所以真的没有办法做我想要的东西? – user484366 2010-10-22 15:39:34

0

因此,你正在处理一个可能重复base64编码的数据块?为什么不直接通过b64decode()循环字符串,直到出错为止?

另外我想你可能不需要洒很多.encode("utf-8")左右。

+0

我认为他意味着他不一定知道base64数据在哪里结束,而不是数据已经被编码了不确定的次数。 – hughdbrown 2010-10-22 15:46:11

0

我看到两个有价值的答案,这里指的是平均字长(Mark Lutton)和原始数据的字节大小(Will Hartung)。另一个有用的事情:寻找期望的字典单词,有意义的数字或/和日期。