ZIP-архив
В этой статье описывается устройтво формата ZIP.
Файл состоит из трех частей: заголовка, данных (файлов) и таблицы файлов.
Заголовой архива распологается в самом его конце и имеет вид:
struct ZIP_CENTDIREND { DWORD sign; // end of central dir signature 4 bytes (0x06054b50) WORD disknum; // number of this disk 2 bytes WORD diskcdstart; // number of the disk with the // start of the central directory 2 bytes WORD countcddisk; // total number of entries in the // central directory on this disk 2 bytes WORD countcd; // total number of entries in // the central directory 2 bytes DWORD cdsize; // size of the central directory 4 bytes DWORD cdoffset; // offset of start of central // directory with respect to // the starting disk number 4 bytes WORD lencomm; // .ZIP file comment length 2 bytes };
Непостредственно перед заголовком находится таблица файлов (Central directory). Она состоит из набора записей формата:
struct ZIP_CENTDIRFILE { DWORD sign; // central file header signature 4 bytes (0x02014b50) WORD vermade; // version made by 2 bytes WORD ver; // version needed to extract 2 bytes WORD flags; // general purpose bit flag 2 bytes WORD compr; // compression method 2 bytes WORD lastmodtime; // last mod file time 2 bytes WORD lastmoddate; // last mod file date 2 bytes DWORD crc32; // crc-32 4 bytes DWORD sizecompr; // compressed size 4 bytes DWORD sizeorig; // uncompressed size 4 bytes WORD lenname; // file name length 2 bytes WORD lenextr; // extra field length 2 bytes WORD lencomm; // file comment length 2 bytes WORD disknum; // disk number start 2 bytes WORD intattr; // internal file attributes 2 bytes DWORD extattr; // external file attributes 4 bytes DWORD offset; // relative offset of local header 4 bytes };
От начала архиво и вплоть до таблицы файлов находятся сами данные. Запись каждого файла состоит из заголовка и непостредственно данных. Локальный заголовок файла имеет вид:
struct ZIP_LOCALFILEHDR { DWORD sign; // local file header signature 4 bytes (0x04034b50) WORD ver; // version needed to extract 2 bytes WORD flags; // general purpose bit flag 2 bytes WORD compr; // compression method 2 bytes WORD lastmodtime; // last mod file time 2 bytes WORD lastmoddate; // last mod file date 2 bytes DWORD crc32; // crc-32 4 bytes DWORD sizecompr; // compressed size 4 bytes DWORD sizeorig; // uncompressed size 4 bytes WORD lenname; // file name length 2 bytes WORD lenextr; // extra field length 2 bytes };