Как создать zip-файл с разделом дескриптора данных

zip zipfile

854 просмотра

1 ответ

538 Репутация автора

Есть ли способ создать zip-файл и заставить его иметь раздел дескриптора данных из командной строки?

Автор: dafnahaktana Источник Размещён: 18.07.2016 01:20

Ответы (1)


1 плюс

285304 Репутация автора

Решение

В комментарии к Github ( https://github.com/adamhathcock/sharpcompress/issues/88#issuecomment-215696631 ) я нашел предложение использовать -fdфлаг:

Просто к сведению, при создании ZIP-файла я также использовал параметр командной строки, -fdкоторый обеспечивает использование дескрипторов данных. Не уверен, что инструмент ZIP в OSX предоставляет этот параметр, но я заметил, что вы не использовали его при создании файла ZIP

Поэтому я протестировал его (со стандартным zipинструментом в OS X, «Zip 3.0 (5 июля 2008 г.)») и подтвердил, что он действительно генерирует zip-файл с набором дескрипторов данных следующим образом:

/ tmp> touch empty.txt
/ tmp> zip -fd foo.zip empty.txt
  добавление: empty.txt (хранится 0%)
/ tmp> xxd foo.zip
00000000: 504b 0304 0a00 0800 0000 698d 7c49 0000 PK ........ i. | I ..
00000010: 0000 0000 0000 0000 0000 0900 1 500 656d .............. em
00000020: 7074 792e 7478 7455 5409 0003 a65e 3c58 pty.txtUT .... ^ 50 4b07 0800 0000 0000 0000 0000   ... PK ... 
00000050: 0000 00 50 4b01 021e 030a 0008 0000 0069   ... PK ......... .я
00000060: 8d7c 4900 0000 0000 0000 0000 0000 0009. | Я .............
00000070: 0018 0000 0000 0000 0000 00b0 100100 0000 ................
00000080: 0065 6d70 7479 2e74 7874 5554 0500 03a6 .empty.txtUT ....
00000090: 5e3c 5875 780b 0001 04f5 0100 0004 0000 ^ 

Выделенная жирным шрифтом последовательность из 16 байтов выше является разделом дескриптора данных. Его заголовок 50 4b07 08(или PK..) и формат дескриптора данных определяются спецификацией zip ( https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT ):

  4.3.9  Data descriptor:

        crc-32                          4 bytes
        compressed size                 4 bytes
        uncompressed size               4 bytes

      4.3.9.1 This descriptor MUST exist if bit 3 of the general
      purpose bit flag is set (see below).  It is byte aligned
      and immediately follows the last byte of compressed data.
      This descriptor SHOULD be used only when it was not possible to
      seek in the output .ZIP file, e.g., when the output .ZIP file
      was standard output or a non-seekable device.  For ZIP64(tm) format
      archives, the compressed and uncompressed sizes are 8 bytes each.

...
      4.3.9.3 Although not originally assigned a signature, the value 
      0x08074b50 has commonly been adopted as a signature value 
      for the data descriptor record.  Implementers should be 
      aware that ZIP files may be encountered with or without this 
      signature marking data descriptors and SHOULD account for
      either case when reading ZIP files to ensure compatibility.

Чтобы выяснить, установлен ли третий бит флажка общего назначения, нам нужно проанализировать zip-файл, чтобы найти заголовок файла для empty.txt.

См. Википедию для краткого обзора и таблиц, описывающих значение байтов в zip-файле - https://en.wikipedia.org/wiki/Zip_(file_format) .
Последние 22 байта (начиная с предпоследней строки 504b 0506(или PK..) являются концом записи центрального каталога (EOCD). По смещению 16 в этой записи EOCD 4-байтовое целое число без знака задает начало центрального каталога. Мы имеем 5300 0000( little endian), или 0x53 = 83. Это смещение сразу после секции дескриптора данных, которую мы определили выше. Начиная с 6-го смещения после начала центрального каталога, мы находим пару байтов, которые формируют бит флаг.

0a 00 (little endian) = 00000000 00001010 (binary, big endian)
                                     ^
                            bit 3 of the general purpose flag

Действительно, третий бит (считая справа, начиная с 0) установлен, поэтому мы видим, что созданный выше zip-файл действительно имеет раздел дескриптора данных.

Автор: Rob W Размещён: 28.11.2016 05:42
Вопросы из категории :
32x32