如何創建 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
.壓縮包 (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 extract
1.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 50
if 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
等等 …