2010-10-22 132 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)。另一個有用的事情:尋找期望的字典單詞,有意義的數字或/和日期。