Что такое ZIP-файл?
Файл с расширением .zip — это архив, который может содержать один или несколько файлов или каталогов. Архив может иметь сжатие, примененное к включенным файлам, чтобы уменьшить размер ZIP-файла. Формат файла ZIP был обнародован еще в феврале 1989 года Филом Кацем для архивирования файлов и папок. Формат стал частью утилиты PKZIP, созданной PKWARE, Inc. Сразу после появления доступных спецификаций, многие компании сделали формат файла ZIP частью своих программных утилит, включая Microsoft (начиная с Windows 7), Apple (Mac OS X) и многие другие.
Краткая история формата ZIP-файла
История формата файла ZIP восходит к судебному иску, поданному компанией System Enhancement Associates (SEA) против PKWARE за использование утилиты ARC без разрешений на ее товарный знак и авторских прав на внешний вид продукта и пользовательский интерфейс. До этого Фил Кац переписал исходный код SEA и выпустил PKXARC, экстрактор ARC, и PKARC, компрессор файлов, в качестве бесплатного программного обеспечения для систем на базе MS-DOS. Проиграв судебный процесс, PKWARE больше не могла использовать что-либо, связанное с ARC. Именно здесь появилось новое сжатие файлов, названное ZIP, которое стало частью утилиты PKZIP в PKWARE, Inc.
Кац опубликовал спецификации формата файлов ZIP в общественное достояние, сохранив при этом права собственности на свою утилиту сжатия и извлечения, т.е. PKZIP. Система сжатия ZIP могла (и может) архивировать файлы в папке с помощью 32-битного алгоритма циклической проверки избыточности (CRC) для сжатия файла. размеры. В отличие от ARC, папки .ZIP включали файл каталога, который играл роль кодовой книги криптографа и содержал информацию, необходимую для воспроизведения сжатых файлов.
Поддерживаемые методы сжатия в ZIP
В соответствии со спецификациями формата файла .ZIP поддерживаются следующие методы сжатия.
- Магазин - подразумевает отсутствие сжатия
- Сокращаться, сжиматься
- Сокращение (это подразумевает коэффициенты сжатия в диапазоне от уровня 1 до уровня 4)
- Взрыв
- Выкачать
- Дефлат64
- BZIP2
- ЛЗМА (ЭФС)
- WavPack
- PPMd версия I, ред. 1
DEFLATE — это широко используемый метод сжатия, представляющий собой алгоритм сжатия данных без потерь, использующий комбинацию кодирования LZ77 и Хаффмана и подробно описанный в RFC 1951.
Спецификации формата ZIP-файла
ZIP-файлы имеют возможность хранить несколько файлов с использованием различных методов сжатия, в то же время поддерживая сохранение файла без какого-либо сжатия. Каждый файл хранится/сжимается индивидуально, что помогает извлекать их или добавлять новые без применения сжатия или распаковки ко всему архиву.
Общий формат файла ZIP
Каждый Zip-файл структурирован следующим образом:
Формат ZIP-файла |
---|
Заголовок локального файла 1 |
Данные файла 1 |
Дескриптор данных 1 |
Заголовок локального файла 2 |
Файл данных 2 |
Дескриптор данных 2 |
…. |
…. |
Заголовок локального файла N |
Файл данных N |
Дескриптор данных N |
Заголовок расшифровки архива |
Архивировать дополнительную запись данных |
Центральный каталог |
Формат файла ZIP использует 32-битный алгоритм CRC для целей архивирования. Чтобы отобразить сжатые файлы, ZIP-архив содержит каталог в конце, в котором хранится запись о содержащихся файлах и их местоположении в файле архива. Таким образом, он играет роль кодирования для инкапсуляции информации, необходимой для воспроизведения сжатых файлов. Читатели ZIP используют каталог для загрузки списка файлов без чтения всего ZIP-архива. Формат сохраняет двойные копии структуры каталогов для обеспечения большей защиты от потери данных.
Каждый файл в ZIP-архиве представлен как отдельная запись, где каждая запись состоит из заголовка локального файла, за которым следуют сжатые данные файла. Каталог в конце архива содержит ссылки на все эти записи файла. Читатели ZIP-файлов должны избегать чтения заголовков локальных файлов, и весь список файлов следует читать из каталога. Этот каталог является единственным источником допустимых файловых записей в архиве, так как файлы также могут добавляться ближе к концу архива. Поэтому, если читатель читает локальные заголовки ZIP-архива с самого начала, он может прочитать и недействительные (удаленные) записи, а также те, которые не являются частью каталога, удаляемого из архива.
Порядок записей файлов в центральном каталоге не обязательно должен совпадать с порядком записей файлов в архиве.
Записи ZIP-файла
Записи в ZIP-файле расположены друг за другом, где каждая запись состоит из:
- Заголовок локального файла
- Необязательные дополнительные поля данных
- Пользовательские данные (опционально сжатые/опционально зашифрованные)
Заголовок локального файла каждой записи представляет информацию о файле, такую как комментарий, размер файла и имя файла. Дополнительные поля данных (необязательные) могут содержать информацию о параметрах расширения формата ZIP.
Заголовок локального файла
Заголовок локального файла имеет определенную структуру полей, состоящую из многобайтовых значений. Все значения хранятся в порядке байтов с прямым порядком байтов, где длина поля рассчитывается как длина в байтах. Все структуры ZIP-файла используют 4-байтовые подписи для каждой записи файла. Конец подписи центрального каталога — 0x06054b50, и его можно отличить по собственной уникальной подписи. Ниже приведен порядок информации, хранящейся в заголовке локального файла.
Смещение | Байты | Описание |
---|---|---|
0 | 4 | Подпись заголовка локального файла # 0x04034b50 (читается как прямой порядок байтов) |
4 | 2 | Версия, необходимая для извлечения (минимум) |
6 | 2 | Битовый флаг общего назначения |
8 | 2 | Метод сжатия |
10 | 2 | Время последней модификации файла |
12 | 2 | Дата последнего изменения файла |
14 | 4 | CRC-32 |
18 | 4 | Сжатый размер |
22 | 4 | Размер без сжатия |
26 | 2 | Длина имени файла (n) |
28 | 2 | Дополнительная длина поля (м) |
30 | n | Имя файла |
30+n | m | Дополнительное поле |
Заголовок файла центрального каталога
Смещение | Байты | Описание |
---|---|---|
0 | 4 | Подпись заголовка файла центрального каталога # 0x02014b50 |
4 | 2 | Версия сделана |
6 | 2 | Версия, необходимая для извлечения (минимум) |
8 | 2 | Битовый флаг общего назначения |
10 | 2 | Метод сжатия |
12 | 2 | Время последней модификации файла |
14 | 2 | Дата последнего изменения файла |
16 | 4 | CRC-32 |
20 | 4 | Сжатый размер |
24 | 4 | Размер без сжатия |
28 | 2 | Длина имени файла (n) |
30 | 2 | Дополнительная длина поля (м) |
32 | 2 | Длина комментария файла (k) |
34 | 2 | Номер диска, на котором начинается файл |
36 | 2 | Внутренние атрибуты файла |
38 | 4 | Внешние атрибуты файла |
42 | 4 | Относительное смещение заголовка локального файла. Это количество байтов между началом первого диска, на котором находится файл, и началом заголовка локального файла. Это позволяет программному обеспечению, считывающему центральный каталог, определять положение файла внутри ZIP-файла. |
46 | n | Имя файла |
46+n | m | Дополнительное поле |
46+n+m | k | Комментарий к файлу |
Конец записи центрального каталога
Смещение | Байты | Описание |
---|---|---|
0 | 4 | Конец подписи центрального каталога # 0x06054b50 |
4 | 2 | Номер этого диска |
6 | 2 | Диск, на котором начинается центральный каталог |
8 | 2 | Количество записей центрального каталога на этом диске |
10 | 2 | Общее количество записей центрального каталога |
12 | 4 | Размер центрального каталога (байты) |
16 | 4 | Смещение начала центрального каталога относительно начала архива |
20 | 2 | Длина комментария (n) |
22 | n | Комментарий |