Какво е 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.
Katz пусна спецификациите на ZIP файловия формат в обществено достояние, като същевременно запази правата на собственост върху своята програма за компресиране и извличане, т.е. PKZIP. Системата за компресиране на ZIP беше (и е) в състояние да архивира файлове в папка посредством алгоритъм за 32-битова циклична проверка за излишък (CRC) за компресиране на файл размери. За разлика от ARC, .ZIP папките включват файл с директория, който играе ролята на кодова книга на криптограф, съдържащ информацията, необходима за изобразяване на компресираните файлове.
Поддържани методи за компресиране в ZIP
Според спецификациите на файловия формат .ZIP се поддържат следните методи за компресиране.
- Store - предполага липса на компресия
- Свиване
- Намаляване (Това предполага фактори на компресия, вариращи от ниво 1 до ниво 4)
- Експлозия
- Изпускане на въздух
- Дефлат64
- BZIP2
- LZMA (EFS)
- WavPack
- PPMd версия I, Rev 1
DEFLATE е често използваният метод за компресиране, който е алгоритъм за компресиране на дата без загуби, който използва комбинация от кодиране LZ77 и Huffman и е описан подробно в 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 | Допълнителна дължина на полето (m) |
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 | Допълнителна дължина на полето (m) |
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 | Коментар |