如何创建 zip 文件 v2.0?

如何创建 zip 文件 v2.0?

如何创建 zip 文件v2.0

看来 OpenDocument 文件是 zip 文件 v2.0:

$ file foo.odt
foo.odt: OpenDocument Text
$ hexdump -C -n 16 foo.odt
00000000  50 4b 03 04 14 00 00 08  00 00 03 0d 47 42 5e c6  |PK..........GB^.|
00000010

第五个字节是0x14

但是如果我解压缩foo.odt并将其重新压缩到 中bar.odt,我会得到一个 v1.0 zip 文件:

$ unzip -d foo foo.odt
$ cd foo/
$ zip -0 -X ../bar.odt mimetype
$ zip -r ../bar.odt * -x mimetype
$ file ../bar.odt
bar.odt: Zip archive data, at least v1.0 to extract
$ hexdump -C -n 16 ../bar.odt
00000000  50 4b 03 04 0a 00 00 00  00 00 00 90 46 42 5e c6  |PK..........FB^.|
00000010

第五个字节是0x0a

zip (2.32)、Debian (6.0)

答案1

编辑:好的。请注意问题已更新,因此您得到的不是 v0.1,而是 v1.0。不再适用。

版本不是文件的“功能有多强大”,而是文件的功能是什么最低限度需要版本才能解压档案中的文件。

这是不是存档的整体版本!

这里的一个区别是,例如 OO 标签全部具有相同版本要求的文件。这又是文档(所有存档)中要求最高的文件。

那是。每个文件都有一个 zip 标头,指定提取该文件所需的最低版本。通过上述我们通常有:

  archive-files    PackType  Zip-Required OO-Header `zip`-header
+--------------------------------------------------------------+
| mimetype         Store     1.0          2.0        1.0        |__ foo.odt
| content.xml      Deflate   2.0          2.0        2.0        |
+---------------------------------------------------------------+

因此,OO 将必需的标志设置为 2.0,即使它是 1.0。但这并不影响打开文档的能力。 (即使mimetype标记为 v1.0,也可以在 OO 中打开手动压缩的文件)。

版本

foo.odt:

1400   Version needed to extract.
0008   General Purpose
0000   Compression method

提取所需版本,此处低字节0x14,通过除以 10 并取模来转换:

Major: 0x14 / 0x0a = 2
Minor: 0x14 % 0x0a = 0

又名 2.0 版

高字节0x00表示该文件与什么兼容。如果为零,则与 MS-DOS(FAT、FAT32、VFAT)兼容。否则它由映射指定。例如,如果我zip在系统上不使用任何选项,我会得到一个0x03指示 Unix 的信息。0x0a是NTFS等

2.0版本表示: (4.4.3.2 当前最低功能版本)

* File is a folder (directory)
* File is compressed using Deflate compression
* File is encrypted using traditional PKWARE encryption

在您的压缩文件中,您有:

bar.odt:

0a00   Version needed to extract.
0000   General Purpose
0000   Compression method


Major: 0x0a / 0x0a = 1
Minor: 0x0a % 0x0a = 0

又名1.0版本


版本 1.0 只是默认值。

文件层次结构和最低版本

1.0您看到下面版本的原因提取所需版本- 那是你吗实际上看到是文件的 zip 标头mimetype。该文件未压缩,而是存储为压缩。因此,您只需要版本1.0即可提取该文件。然而,这并不是档案的整体版本。如果你再往下看,只要你发现一个用放气保存的文件,你就会发现 2.0 版本。您可以通过以下方式检查:

hexdump -v -e '/1 "%02x "' bar.odt | grep -o '50 4b 03 04 .\{6\}'

应该给你类似的东西

50 4b 03 04 0a 00 
50 4b 03 04 0a 00 
...
50 4b 03 04 14 00 
50 4b 03 04 14 00 
50 4b 03 04 0a 00 
50 4b 03 04 14 00 
...
中央目录文件头

有些文件带有扩展标头。您可以通过以下方式列出这些:

hexdump -v -e '/1 "%02x "' foo.odt | grep -o '50 4b 01 02.\{16\}'

(记得反转50 4b ...if 02 01 4b 50hexdump -n 4 foo.odt 这么说)

通过这个你通常会得到:

                  ____________ Version required (2.0)
                  |   |
50 4b 01 02 14 00 14 00 00 
50 4b 01 02 14 00 14 00 00 
50 4b 01 02 14 00 14 00 08
            |___| 
              |      
              +-------------- Version supported by packing application. v2.0

zip创建的文件上你可以得到例如:

                  ____________ Version required for this file (2.0)
                  |   |
50 4b 01 02 1e 03 14 00 00
            |___| 
              |      
              +-------------- Version supported by packing 
                              application. v3.0

通用(以及 odt 文件中设置的其他标志)

这是一个位标志。由于您的文件是大端/摩托罗拉,因此该标志变为:

0x0800 = 0000 1000 0000 0000
              |
              +---------------- 11 => File names and comments MUST be 
                                      stored as Utf-8.

至少 LibreOffice 通过各种 mod 可以进一步节省。

mimetype总是第一个并且不应该被压缩。这是为了帮助各种软件识别文件及其内容。通过这个可以例如:

$ hexdump -C -s ​​38 -n 39 foo.odt

00000026  61 70 70 6c 69 63 61 74  69 6f 6e 2f 76 6e 64 2e  |application/vnd.|
00000036  6f 61 73 69 73 2e 6f 70  65 6e 64 6f 63 75 6d 65  |oasis.opendocume|
00000046  6e 74 2e 74 65 78 74                              |nt.text|

虽然zip通常会保存所有目录,但 OO 仅保存空目录。因此:

压缩:

Thumbnails/
Thumbnails/thumbnail.png
META-INF/
META-INF/manifest.xml

噢:

Thumbnails/thumbnail.png
META-INF/manifest.xml

等等 ...

答案2

正如您所说,ODF 文档是一个 zip 文件。看看维基百科的入口。这zip格式应该有 2 个字节的版本,小端序,偏移量 4。标头开始0x04034b50(小端序,检查),版本为两个字节(0x000a在你的自压缩情况下,0x0014在你的 ODT 和我已经躺着的一个中)从 2006 年开始)。该格式适应不同的版本。

不幸的是,我的本地zip(1L)unzip(1L)手册页对处理的格式完全保持沉默。我当前的 zip 创建版本0x0014(zip-3.0-5.fc18.x86_64,Fedora 18)。看起来您需要 zip 版本 3 左右。

相关内容