如何创建 zip 文件 v2.0?

n.r*_*.r. 7 zip

如何创建 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
Run Code Online (Sandbox Code Playgroud)

第五个字节是0x14

但是,如果我解压缩foo.odt并将其压缩回bar.odt.zip 文件,则会得到一个 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
Run Code Online (Sandbox Code Playgroud)

第五个字节是0x0a

zip (2.32), Debian (6.0)

Run*_*ium 6

编辑:好的。注意问题已更新,因此您得到的不是 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        |
+---------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

版本

foo.odt:

1400   Version needed to extract.
0008   General Purpose
0000   Compression method
Run Code Online (Sandbox Code Playgroud)

提取所需的版本,这里是低字节,0x14通过除以模数除以 10 进行转换:

Major: 0x14 / 0x0a = 2
Minor: 0x14 % 0x0a = 0
Run Code Online (Sandbox Code Playgroud)

又名 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
Run Code Online (Sandbox Code Playgroud)

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

bar.odt:

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


Major: 0x0a / 0x0a = 1
Minor: 0x0a % 0x0a = 0
Run Code Online (Sandbox Code Playgroud)

又名 1.0 版


1.0 版只是默认值。

文件层次结构和最低版本

1.0需要提取的版本下看到版本的原因是您实际看到的是文件的 zip-header mimetype。这个文件没有被压缩,而是在没有压缩的情况下存储。因此,您只需要 version1.0来提取该文件。然而,这不是档案的整体版本。如果你再往下看,你会在找到一个用放气保存的文件后立即找到 2.0 版。您可以通过例如:

hexdump -v -e '/1 "%02x "' bar.odt | grep -o '50 4b 03 04 .\{6\}'
Run Code Online (Sandbox Code Playgroud)

应该给你类似的东西

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 
...
Run Code Online (Sandbox Code Playgroud) 中央目录文件头

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

hexdump -v -e '/1 "%02x "' foo.odt | grep -o '50 4b 01 02.\{16\}'
Run Code Online (Sandbox Code Playgroud)

(记住扭转50 4b ...02 01 4b 50如果hexdump都-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
Run Code Online (Sandbox Code Playgroud)

zip创建的文件上,您可以获得例如:

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

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

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

0x0800 = 0000 1000 0000 0000
              |
              +---------------- 11 => File names and comments MUST be 
                                      stored as Utf-8.
Run Code Online (Sandbox Code Playgroud)

至少 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|
Run Code Online (Sandbox Code Playgroud)

虽然zip通常保存所有目录,但 OO 如果目录为空,则只保存一个目录。因此:

压缩:

Thumbnails/
Thumbnails/thumbnail.png
META-INF/
META-INF/manifest.xml
Run Code Online (Sandbox Code Playgroud)

哦:

Thumbnails/thumbnail.png
META-INF/manifest.xml
Run Code Online (Sandbox Code Playgroud)

等等 ...