阅读隐藏的zip文件

时间:2015-03-25 00:40:38

标签: java android bitmap

我有一个jpeg,最后我写了一个zip文件。

此zip文件中包含一个名为hidden.txt的txt文件。我可以将扩展名更改为zip并在我的笔记本电脑上正常读取文件(debian)但是当我尝试使用ZipInputStream或使用ZipFile阅读时我收到错误告诉我它#39 ; s不是zip文件。

我首先尝试将jpg部分分开,将整个内容读取到Bitmap,然后将其写入byte[],但byte[]不仅包含图像。

我的方法是结合位图和zipFile(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错误

2 个答案:

答案 0 :(得分:1)

好的,好吧,我将如何做到这一点。虽然它非常hacky。

问题在于很难分辨图像数据和zip数据之间的边界索引。假设您可以在图像数据之后写入任意数据并且仍然有工作图像文件,那么您可以尝试以下方法:

  1. 写出图像数据。
  2. 写出一个神奇的字符串,如" BEGIN_ZIP"
  3. 写出zip数据。
  4. 现在,当您尝试阅读时:

    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.
    

答案 1 :(得分:1)

在JPEG文件中 0xFF,0xD8 字节序列表示图像的开始, 0xFF,0xD9 字节序列表示图像的结束JPEG Structure Wikipedia。因此,只需在文件中搜索后一个序列,您就可以分离图像和zip部分。然后使用ZipInputStream从zip文件中读取(解压缩)数据。