Zip

如何創建 zip 文件 v2.0?

  • February 9, 2013

如何創建 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.

壓縮包 (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        |
+---------------------------------------------------------------+

*所以 OO 將 required 標誌設置為 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 版只是預設值。

文件層次結構和最低版本

您在Version required to extract1.0下看到 version 的原因是您實際看到的是文件的 zip-header 。此文件未壓縮,但未壓縮儲存。因此,您只需要版本即可提取該文件。但是,這不是檔案的整體版本。如果您再往下看,您會在找到使用放氣保存的文件時立即找到 2.0 版。您可以通過以下方式檢查:mimetype``1.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 ...轉到02 01 4b 50if 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

等等 …

引用自:https://unix.stackexchange.com/questions/64019