2015-03-25 86 views
2

我有一個jpeg,並在它的最後寫了一個zip文件。閱讀隱藏的zip文件

這裏面的zip文件是一個名爲hidden.txt一個txt文件。我可以將擴展名更改爲zip並在我的筆記本電腦上讀取文件(debian),但是當我嘗試使用ZipInputStream或使用ZipFile來讀取它時,我收到一個錯誤,告訴我它不是zip文件。

我試着先把整個東西讀到一個Bitmap然後把它寫到byte[],然而byte[]包含的不僅僅是圖像。

我的方法的位圖和zip文件(一byte[]

private byte[] combineFiles(Bitmap drawn, byte[] zip) throws 
     IOException { 
    InputStream in; 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 

    /*write the first file*/ 
    byte[] img; 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    drawn.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); 
    img = byteArrayOutputStream.toByteArray(); 
    in = new ByteArrayInputStream(img); 
    IOUtils.copy(in, out); 
    in.close(); 

    /*add the second (hidden) file*/ 
    in = new ByteArrayInputStream(zip); 

    IOUtils.copy(in, out); 
    out.flush(); 
    in.close(); 
    return out.toByteArray(); 
} 

因此,其實我有兩個問題,結合

  1. 如何分離文件的JPG和zip部分?
  2. 我如何解壓縮hidden.txt(最好爲byte[]
    • 相當肯定我知道這一個,但我目前在做什麼不起作用,可能是因爲我做的#1錯
+0

也許只是在zip文件上輸入密碼? – satnam 2015-03-25 00:50:01

+0

@satnam不是真的是我想要做的,失敗的目的 – Epicblood 2015-03-25 00:52:59

+0

怎麼找到這裏通過搜索合併文件的byte []數組的「PK」幻數的zip文件的ZIP啓動。然後分開兩個流並使用ZipInputStream作爲字節的zip部分。 – faljbour 2015-03-25 01:19:03

回答

1

好吧,以及我將如何做到這一點。雖然很黑。

的問題是,它很難分辨的圖像數據和壓縮數據之間的邊界的索引。假設您可以在圖像數據之後編寫任意數據並且仍然有工作映像文件,您可以嘗試以下內容:

  1. 寫出圖像數據。
  2. 寫出如「BEGIN_ZIP」的神奇字符串
  3. 寫出zip數據。

現在,當你想讀的東西回來:

byte[] data = readAllTheBytes(); 
int index = searchFor("BEGIN_ZIP", data) + "BEGIN_ZIP".length(); 

// now you know that the zip data begins at index and goes to the end of the byte array 
// so just use a regular zipinputstream to read in the zip data. 
+0

我很尷尬,我沒有想到這個,就像一個魅力,作品,謝謝。 – Epicblood 2015-03-25 01:30:51

+2

儘管解決方案是正確的,但更快的解決方案是將一些任意數量的字節(比如8)添加到文件末尾,並在那裏存儲JPEG的長度。這樣你可以立即找到圖像的結尾。 – 2015-03-25 01:42:51

1

在JPEG文件爲0xFF,0xD8字節序列顯示圖像的開始和爲0xFF,0xD9字節序列指示圖片的結尾JPEG Structure Wikipedia。因此,只需在文件中搜索後一個序列,就可以將圖像和zip部分分開。然後使用ZipInputStream從zip文件讀取(解壓縮)數據。

+0

並不那麼簡單。您必須正確解析JPEG以確保您正確讀取記錄,以便在整個記錄出現時只識別0xFFD9。 0xFFD9可能發生在圖像中間的任何地方。 – EJP 2015-03-25 01:30:16

+0

是的,你是對的。人們必須正確解析JPEG文件部分以100%確定0xFFD9序列實際上是圖像文件的真正結束。 – 2015-03-25 01:37:31