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