Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取隐藏的zip文件_Java_Android_Bitmap - Fatal编程技术网

Java 读取隐藏的zip文件

Java 读取隐藏的zip文件,java,android,bitmap,Java,Android,Bitmap,我有一个jpeg,在它的末尾我写了一个zip文件 在这个zip文件中有一个名为hidden.txt的txt文件。我可以将扩展名改为zip并在笔记本电脑(debian)上读取文件,但当我尝试使用ZipInputStream或ZipFile读取文件时,我会收到一个错误,告诉我它不是zip文件 我尝试先将jpg部分分离出来,将整个内容读取到位图中,然后将其写入字节[],但是字节[]包含的不仅仅是图像 组合位图和zipFile的方法(一个字节[]) 所以我有两个问题 如何分离文件的jpg和zip部分 如

我有一个jpeg,在它的末尾我写了一个zip文件

在这个zip文件中有一个名为
hidden.txt
的txt文件。我可以将扩展名改为zip并在笔记本电脑(debian)上读取文件,但当我尝试使用
ZipInputStream
ZipFile
读取文件时,我会收到一个错误,告诉我它不是zip文件

我尝试先将jpg部分分离出来,将整个内容读取到
位图中,然后将其写入
字节[]
,但是
字节[]
包含的不仅仅是图像

组合位图和zipFile的方法(一个
字节[]

所以我有两个问题

  • 如何分离文件的jpg和zip部分
  • 如何解压缩
    hidden.txt
    (最好是解压缩到
    字节[]
    • 我很肯定我知道这一点,但我目前所做的工作不起作用,可能是因为我做错了

  • 好吧,我会这样做的。虽然它很粗糙

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

  • 写出图像数据
  • 写出一个神奇的字符串,如“BEGIN_-ZIP”
  • 写出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.
    

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

    也许只是在zip文件上输入一个密码?@satnam不是我真正想做的,通过搜索组合文件的byte[]数组查找zip文件的“PK”幻数来找到zip文件的起始位置,这一目的失败了。然后将两个流分开,并对字节的zip部分使用ZipInputStream。@faljbour我试过了,但我认为我做得不对,因为它一直找不到它。你所说的“将整个内容读取到
    位图
    ”到底是什么意思?我希望任何读取输入流并生成
    位图的方法在图像末尾停止读取,因此流的其余部分是.zip数据。这并不是那么简单。您必须正确解析JPEG,以确保正确读取记录,以便仅在0xFFD9作为整个记录出现时才能识别它。0xFFD9可能出现在图像中间的任何地方。是的,你是对的。必须正确解析JPEG文件部分,才能100%确定0xFFD9序列实际上是图像文件的结尾。我很尴尬,我没有想到这一点,就像一个魔咒,谢谢。虽然解决方案是正确的,但更快的解决方案是在文件末尾添加一些字节数(比如说8个字节),并将JPEG的长度存储在那里。这样你们就可以立即找到图像的结尾。
    
    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.