Давным-давно, когда создавался формат ZIP и всем хватало 640KB памяти, никто не задумывался, что файл может быть >4GB и содержать в себе больше 65535 элементов, поэтому поддержка таких объемов прикручена костылями и называется ZIP64. До сих пор этот формат плохо понимают Far Manager, 7-Zip и проводник седьмой винды (а говорят, что в Microsoft берут только гениальных программистов, возьмите меня, я умнее, чем выгляжу).
Расширение ZIP64 добавляет две основные фичи:
- структура
ZIP64 End Of Central Directory Record (EOCD64)с 64-битными полями иZIP64 End Of Central Directory Locatorдля поиска структурыEOCD64 - если значения некоторых полей
Central Directory HeaderиLocal File Headerпревышают максимальный, то эти значения записываются в Extra Field этих структур в специальном форматеZIP64 Extended Extra Field
А теперь подробнее про эти нововведения.
ZIP64 End Of Central Directory Locator
Используется для поиска структуры EOCD64 и находится сразу перед стандартным End Of Central Directory Record.
End of central directory record. Если 16-битные поля равны 0xFFFF или 32-битные — 0xFFFFFFFF, значит такая запись должна быть.
ZIP64 End Of Central Directory Record
Эта структура представляет собой 64-битную версию стандартного End Of Central Directory Record. Находится по адресу EOCD64Locator.eocd64Offset.
Extra Field
Если вы внимательно читали мои предыдущие заметки на тему ZIP формата (описание формата ZIP, чтение ZIP файла, запись ZIP файла), то могли заметить, что у записей типа Local File Header и Central directory file header есть поля под названием extraField.
В это поле записываются расширенные данные, о которых не было известно на момент создания первой версии формата ZIP. В этом поле могут содержаться разные типы данных и реализуется это последовательностью структур типа ExtraFieldRecord:
ExtraFieldRecord.data для ZIP64 extended information выглядят так:
Например, структура Central directory file header будет содержать 0xFFFFFFFF только в поле localFileHeaderOffset, значит в Extra Field будет лежать только значение localFileHeaderOffset, а остальные поля будут отсутствовать.
Порядок действий
- определить наличие
EOCD64проверкой полейEOCDна переполнение и считать сначалаEOCD64Locator, затемEOCD64 - для каждой структуры типа
Central directory file headerиLocal File Headerопределить поля на переполнение и, если таковые присутствуют, то считать их значения изExtraField
Вот, в принципе, и вся наука. Вы не подумайте, что я нашел эту информацию тщательным изучением ZIP файлов, просто читайте спецификацию ZIP формата (на английском).