Wie kann ich eine Zip-Datei v2.0 erstellen?

7

Wie kann ich eine Zip-Datei v2.0 erstellen ?

Es scheint, dass OpenDocument-Dateien Zip-Dateien v2.0 sind:

$ 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

Das fünfte Byte ist 0x14.

Wenn ich es jedoch entpacke foo.odtund wieder komprimiere bar.odt, erhalte ich eine ZIP-Datei der Version 1.0 :

$ 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

Das fünfte Byte ist 0x0a.

zip (2.32), Debian (6.0)

nr
quelle

Antworten:

6

Bearbeiten: OK. Hinweis Frage wurde aktualisiert, so dass Sie nicht eine v0.1, sondern v1.0 erhalten. gilt nicht mehr.

Die Version ist nicht "wie leistungsfähig" die Datei ist, sondern welche Mindestversion erforderlich ist, um diese Datei aus dem Archiv zu extrahieren .

Dies ist nicht die Gesamtversion für das Archiv!

Ein Unterschied besteht darin, dass z. B. OO alle Dateien mit derselben Versionsanforderung markiert. Dies ist wiederum die Datei im Dokument (Archiv über alles) mit den höchsten Anforderungen.

Das ist. Jede Datei verfügt über einen Zip-Header, der die zum Extrahieren erforderliche Mindestversion angibt. Durch die oben genannten haben wir in der Regel:

  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        |
+---------------------------------------------------------------+

Also setzte OO das erforderliche Flag auf 2.0, obwohl es 1.0 ist. Dies hat jedoch keinen Einfluss auf die Möglichkeit, das Dokument zu öffnen. (Es ist in Ordnung, eine manuell komprimierte Datei in OO zu öffnen, obwohl sie mimetypemit v1.0 gekennzeichnet ist.)

Versionen

foo.odt:

1400   Version needed to extract.
0008   General Purpose
0000   Compression method

Die zum Extrahieren benötigte Version , hier das untere Byte 0x14, wird durch Teilen und Modul durch 10 übersetzt:

Major: 0x14 / 0x0a = 2
Minor: 0x14 % 0x0a = 0

Aka Version 2.0

Das höhere Byte 0x00gibt an, mit was die Datei kompatibel ist. Wenn Null, ist es mit MS-DOS (FAT, FAT32, VFAT) kompatibel. Andernfalls wird es durch eine Zuordnung angegeben. Wenn ich zB zipohne Optionen auf meinem System verwende, erhalte ich eine, 0x03die Unix anzeigt. 0x0aist NTFS usw.

Version 2.0 zeigt Folgendes an: (4.4.3.2 Aktuelle Mindestfunktionsversionen)

* File is a folder (directory)
* File is compressed using Deflate compression
* File is encrypted using traditional PKWARE encryption

In Ihrer Zip-Datei haben Sie:

bar.odt:

0a00   Version needed to extract.
0000   General Purpose
0000   Compression method


Major: 0x0a / 0x0a = 1
Minor: 0x0a % 0x0a = 0

Aka Version 1.0


Version 1.0 ist einfach der Standardwert.

Dateihierarchie und Mindestversion

Der Grund, warum Sie die Version 1.0unter Version sehen, die zum Extrahieren benötigt wird, ist, dass Sie tatsächlich den Zip-Header für die Datei sehen mimetype. Diese Datei wird nicht entleert, sondern ohne Komprimierung gespeichert . Daher benötigen Sie nur die Version 1.0, um diese Datei zu extrahieren. Dies ist jedoch nicht die Gesamtversion des Archivs. Wenn Sie weiter nach unten schauen, finden Sie Version 2.0, sobald Sie eine mit Deflating gespeicherte Datei finden. Sie können überprüfen, indem Sie z.

hexdump -v -e '/1 "%02x "' bar.odt | grep -o '50 4b 03 04 .\{6\}'

Sollte dir so etwas geben

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 
...
Header der zentralen Verzeichnisdatei

Es gibt einige Dateien mit einem erweiterten Header. Sie können diese auflisten, indem Sie:

hexdump -v -e '/1 "%02x "' foo.odt | grep -o '50 4b 01 02.\{16\}'

(Denken Sie daran, umzukehren 50 4b ..., 02 01 4b 50wenn hexdump -n 4 foo.odt dies sagt)

Auf diese Weise erhalten Sie in der Regel:

                  ____________ 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

Auf die ziperstellte Datei könnte man zB bekommen:

                  ____________ Version required for this file (2.0)
                  |   |
50 4b 01 02 1e 03 14 00 00
            |___| 
              |      
              +-------------- Version supported by packing 
                              application. v3.0

Allgemeiner Zweck (und anderes in Odt-Dateien gesetztes Flag)

Dies ist eine kleine Flagge. Da Ihre Datei Big-Endian / Motorola ist, lautet die Flagge:

0x0800 = 0000 1000 0000 0000
              |
              +---------------- 11 => File names and comments MUST be 
                                      stored as Utf-8.

Zumindest spart LibreOffice mit verschiedenen Mods weiter.

mimetypesteht immer an erster Stelle und sollte nicht komprimiert werden. Dies soll verschiedenen Softwareprogrammen helfen, die Datei und ihren Inhalt zu identifizieren. Auf diese Weise kann man zB:

$ 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|

Während zipnormalerweise alle Verzeichnisse gespeichert werden, speichert OO nur ein Verzeichnis, wenn es leer ist. Somit:

Postleitzahl:

Thumbnails/
Thumbnails/thumbnail.png
META-INF/
META-INF/manifest.xml

oo:

Thumbnails/thumbnail.png
META-INF/manifest.xml

Und so weiter ...

Runium
quelle
2

Ein ODF-Dokument ist, wie Sie angeben, eine Zip-Datei. Schauen Sie sich den Eintrag von Wikipedia an . Das Zip-Format soll die Version in 2 Bytes, Little Endian, bei Offset 4 haben. Ein Header beginnt 0x04034b50(Little Endian, Check), die Version in zwei Bytes ( 0x000ain Ihrem selbstkomprimierten Fall, 0x0014in Ihrem ODT und in einem I '). seit 2006 hier herumliegen). Das Format bietet Platz für verschiedene Versionen.

Meine lokalen zip(1L)und unzip(1L)Manpages enthalten leider keine Informationen zu den behandelten Formaten. Meine aktuelle Zip-Version erstellt 0x0014(zip-3.0-5.fc18.x86_64, Fedora 18). Es sieht so aus, als ob Sie eine Zip-Version 3 oder so benötigen.

vonbrand
quelle