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
5番目のバイトはです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
5番目のバイトはです0x0a
。
zip(2.32)、Debian(6.0)
答え1
編集:わかりました。v0.1ではなくv1.0を取得できるように質問が更新されました。これ以上適用できません。
バージョンはファイルの「強力」ではなく、ファイルの機能です。最低限度で解凍するにはバージョンが必要です。それアーカイブのファイル。
これはいいえフルバージョンをアーカイブしました!
ここでの違いの1つは、たとえば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は必須フラグが1.0であるにもかかわらず、2.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
互換性のある項目を示します。 0の場合、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
zipファイルには次のものがあります。
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
ファイルを抽出するにはそのバージョンのみが必要です。しかし、これはアーカイブの完全なバージョンではありません。詳しくは、deflateとして保存されたファイルを見つけるたびにバージョン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\}'
( hexdump -n 4 foo.odt がそう言ったら逆にしなければならない50 4b ...
ことを覚えておいてください)02 01 4b 50
これにより、一般的に次のようになります。
____________ 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はさまざまなモードを使用してより多くのコストを節約できます。
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
など...
答え2
あなたが言ったように、ODF文書はzipファイルです。ウィキペディアを見てください入り口。これzip形式2バイトバージョン、リトルエンディアン、オフセット4が必要です。ヘッダーの開始0x04034b50
(リトルエンディアン、確認)、バージョンは2バイトです(あなたのODTと私が2006年から0x000a
独自の圧縮ケースに保管してきたバイト)。0x0014
フォーマットはさまざまなバージョンに合わせて調整されます。
残念ながら、私のローカルページzip(1L)
とunzip(1L)
マニュアルページには、処理される形式に関する内容はまったくありません。私の現在のzip生成バージョン0x0014
(zip-3.0-5.fc18.x86_64、Fedora 18)。 zipバージョン3程度が必要なようです。