如何创建 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)
编辑:好的。注意问题已更新,因此您得到的不是 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)
这是一个小标志。由于您的文件是大端/摩托罗拉,标志变为:
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)
等等 ...