如何手动读取 zip 文件头

How to read zip file header manually

我有一个文件,其中有非常重要的 java 项目源代码丢失了。 这是一个精灵文件。当我用编辑器打开它时,大部分内容都是不可读的,但完整的 java 项目似乎作为一个未压缩的 zip 文件夹嵌入到文件中,其中包含文件夹结构和所有内容(不要问我为什么。我只是想获取信息回来我概不负责)。

elf文件中的相关信息如下:

PK
  Üi‰L§½kQ   Q   9   file/path/i/cant/show/contenttext
content
content

因为我不知道 zip 文件夹从哪里开始和结束,而且因为所有内容都未压缩,所以我的想法是编写一个小脚本从 elf 文件中抓取并创建完整的 java 项目那。

为此,我想要文件头中的文件名长度,以便很容易知道文件名在哪里结束,文件内容从哪里开始。

PK Üi‰L§½kQ Q 9 似乎是压缩文件的文件头。我将它转换为十六进制,它看起来像这样:504B03040A2020082020DC69894CA71E BD6B512020205120202039202020 我尝试使用 wikipedia:

中的信息对其进行格式化
504B0304 //sig (this showed me i did something right)
0A20 // version
2008 // generalpurpose flag
2020 // compression method
DC69 // File last modification time 
894C // File last modification date 
A71EBD6B //CRC-32 of uncompressed data 
51202020 //Compressed size (or 0xffffffff for ZIP64) 
51202020 //Uncompressed size (or 0xffffffff for ZIP64) 
3920  //File name length (n) 
2020 //Extra field length (m) 

和Endian开关:

04034B50 //sig
200A // version
0820 // generalpurpose flag
2020 // compression method
69DC // File last modification time 
4C89 // File last modification date 
6BBD1EA7 //CRC-32 of uncompressed data 
20202051 //Compressed size (or 0xffffffff for ZIP64) 
20202051 //Uncompressed size (or 0xffffffff for ZIP64) 
2039  //File name length (n) 
2020 //Extra field length (m) 

但似乎有些不对劲。文件头的长度是正确的(30 字节加上文件名),数字似乎在正确的位置有信息,但 2020 应该是 0000 压缩。对我来说,转换为十六进制似乎只对了一半。 我必须更改什么才能获得正确的数字?

我发现了我的错误。 奇怪的 2020 而不是 0000 的问题是我的错误。我在记事本++中打开文件,将有趣的部分复制到一个新文件中,并将它们转换成十六进制。我认为复制改变了数据。当我直接在十六进制编辑器中打开文件时,压缩文件头就可以了。