Como posso criar um arquivo zip v2.0?

7

Como posso criar um arquivo zip v2.0 ?

Parece que os arquivos OpenDocument são arquivos 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

O quinto byte é 0x14 .

Mas se eu descompactar foo.odt e zipar de volta para bar.odt , recebo um arquivo zip v1.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

O quinto byte é 0x0a .

zip (2.32), Debian (6.0)

    
por n.r. 07.02.2013 / 03:30

2 respostas

6

Editar: OK. A questão do aviso foi atualizada, portanto, você não recebe a v0.1, mas a v1.0. não se aplica mais.

A versão não é "qual a capacidade" do arquivo, mas a versão mínima é necessária para extrair esse arquivo do arquivo.

Isto não é a versão geral do arquivo!

Uma diferença aqui é que, por exemplo OO marca os arquivos all com o mesmo requisito de versão. Esse, por sua vez, é o arquivo no documento (arquivo acima de tudo) com os mais altos requisitos.

Isso é. Cada arquivo tem um cabeçalho zip que especifica a versão mínima necessária para extraí-lo. Pelo acima, temos tipicamente:

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

Assim, o OO define o sinalizador requerido como 2.0, mesmo sendo 1.0. No entanto, isso não afeta a capacidade de abrir o documento. (Não há problema em abrir um arquivo zip'ed manualmente no OO, mesmo que mimetype esteja marcado com v1.0).

Versões

foo.odt:

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

Versão necessária para extrair , aqui o byte mais baixo, 0x14 , é traduzido dividindo e módulo por 10:

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

Versão Aka 2.0

O byte superior 0x00 indica com o que o arquivo é compatível. Se zero, então é compatível com o MS-DOS (FAT, FAT32, VFAT). Além disso, é especificado por um mapeamento. Por exemplo. se eu usar zip sem opções no meu sistema, recebo um 0x03 que indica Unix. 0x0a é NTFS, etc.

A versão 2.0 indica: (4.4.3.2 Versões mínimas atuais do recurso)

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

No arquivo zip'ed você tem:

bar.odt:

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


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

Aka versão 1.0

A versão 1.0 é simplesmente o valor padrão.

Hierarquia de arquivos e versão mínima

O motivo pelo qual você vê a versão 1.0 em Versão necessária para extrair - é que o que você realmente vê é o cabeçalho zip do arquivo mimetype . Este arquivo não é esvaziado, mas armazenado com a compactação no . Assim, você só precisa da versão 1.0 para extrair esse arquivo. Isso, no entanto, não é a versão geral do arquivo. Se você olhar mais para baixo, encontrará a versão 2.0 assim que encontrar um arquivo salvo com deflação. Você pode verificar, por exemplo:

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

Deve fornecer algo como

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 
...
Cabeçalho do arquivo do diretório central

Existem alguns arquivos com um cabeçalho estendido. Você pode listá-los por:

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

(Lembre-se de inverter 50 4b ... para 02 01 4b 50 se hexdump -n 4 foo.odt diga isso)

Por isso você vai ter tipicamente:

                  ____________ 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

No arquivo zip criado, você pode obter, por exemplo:

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

Propósito geral (e outro sinalizador definido em arquivos odt)

Este é um flag de bit. Como seu arquivo é big-endian / Motorola, a bandeira se torna:

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

Pelo menos o LibreOffice economiza ainda mais com vários mods.

mimetype é sempre o primeiro e não deve ser compactado. Isso é para ajudar vários softwares a identificar o arquivo e seu conteúdo. Por este pode, por exemplo:

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

Enquanto zip normalmente salva todos os diretórios, o OO salva apenas um diretório se estiver vazio. Assim:

zip:

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

oo:

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

E assim por diante ...

    
por 08.02.2013 / 08:40
2

Um documento ODF é um arquivo zip, como você afirma. Veja a entrada da Wikipedia. O formato zip deve ter a versão em 2 bytes, little endian, no deslocamento 4. Um cabeçalho inicia 0x04034b50 (little endian, check), versão em dois bytes ( 0x000a no seu caso auto-comprimido, 0x0014 no seu ODT e em um que eu tenho aqui em 2006). O formato acomoda diferentes versões.

Minhas páginas locais zip(1L) e unzip(1L) man são totalmente silenciosas em formatos manipulados, infelizmente. Meu zip atual cria a versão 0x0014 (zip-3.0-5.fc18.x86_64, Fedora 18). Parece que você precisa do zip versão 3 ou mais.

    
por 07.02.2013 / 04:14

Tags