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
};