如何创建 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 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
在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
等等 ...