Двоичный формат составного файла - Compound File Binary Format

Двоичный формат составного файла (CFBF), также называемый Составной файл, Формат составного документа,[1] или же Составной файл документа, версия 2[2] (CDF), является сложный формат файла документа для хранения множества файлов и потоков в одном файле на диске. CFBF разработан Microsoft и является реализацией Microsoft Структурированное хранилище COM.[3][4][5]

Microsoft открыла формат для использования другими, и теперь он используется во множестве программ от Microsoft Word и Microsoft Access в Business Objects.[нужна цитата ] Он также составляет основу Расширенный формат авторинга.[6]

Обзор

В простейшем случае двоичный формат составного файла представляет собой контейнер с небольшими ограничениями на то, что в нем можно хранить.

Файловая структура CFBF слабо напоминает ТОЛСТЫЙ файловая система. Файл разбит на Секторов которые связаны вместе с Таблица размещения файлов (не путать с одноименной файловой системой), которая содержит цепочки секторов, связанных с каждым файлом, Каталог содержит информацию о содержащихся файлах с идентификатором сектора (SID) для начального сектора цепочки и т. д.

Структура

Файл CFBF состоит из 512-байтовой записи заголовка, за которой следует ряд секторов, размер которых определяется в заголовке. В литературе определяется, что секторы имеют длину 512 или 4096 байт, хотя формат потенциально способен поддерживать секторы размером от 128 байт и выше в степени 2 (128, 256, 512, 1024 и т. Д.). Нижний предел 128 - это минимум, необходимый для размещения одной записи каталога в Секторе Справочника.[соответствующий? ]

Есть несколько типов секторов, которые могут присутствовать в CFBF:

  • Сектор таблицы размещения файлов (FAT) - содержит цепочки индексов секторов так же, как FAT в файловых системах FAT / FAT32.
  • Секторы MiniFAT - похожи на FAT, но хранят цепочки мини-секторов внутри Mini-Stream
  • Сектор Double-Indirect FAT (DIFAT) - содержит цепочки индексов сектора FAT
  • Сектор каталога - содержит записи каталога
  • Сектор потока - содержит данные произвольного файла
  • Сектор блокировки диапазона - содержит область блокировки диапазона байтов большого файла

Более подробная информация о заголовке и каждом типе сектора приводится ниже.

Формат заголовка CFBF

Заголовок CFBF занимает первые 512 байтов файла и информацию, необходимую для интерпретации остальной части файла. Объявление структуры C-Style ниже (извлеченное из спецификации низкоуровневого контейнера AAFA) показывает элементы заголовка CFBF и их назначение:

 typedef беззнаковый длинный ULONG;    // 4 байта typedef беззнаковый короткая USHORT;  // 2 байта typedef короткая КОМПЕНСИРОВАТЬ;           // 2 байта typedef ULONG РАЗДЕЛ;             // 4 байта typedef ULONG ФСИНДЕКС;          // 4 байта typedef USHORT FSOFFSET;        // 2 байта typedef USHORT WCHAR;           // 2 байта typedef ULONG ПОДПИСЬ;      // 4 байта typedef беззнаковый char БАЙТ;     // 1 байт typedef беззнаковый короткая СЛОВО;    // 2 байта typedef беззнаковый длинный DWORD;    // 4 байта typedef ULONG SID;              // 4 байта typedef GUID CLSID;             // 16 байтов структура StructuredStorageHeader { // [смещение от начала (байты), длина (байты)]     БАЙТ _abSig[8];             // [00H, 08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1,                                 // 0x1a, 0xe1} для текущей версии     CLSID _clsid;               // [08H, 16] зарезервировано должно быть равно нулю (WriteClassStg /                                 // GetClassFile использует идентификатор класса корневого каталога)     USHORT _uMinorVersion;      // [18H, 02] второстепенная версия формата: 33 - это                                 // написано по ссылке реализации     USHORT _uDllVersion;        // [1AH, 02] основная версия dll / формат: 3 для                                 // 512-байтовые сектора, 4 для секторов по 4 КБ     USHORT _uByteOrder;         // [1CH, 02] 0xFFFE: указывает порядок байтов Intel     USHORT _uSectorShift;       // [1EH, 02] размер секторов в степени двойки;                                 // обычно 9 обозначает 512-байтовые сектора     USHORT _uMiniSectorShift;   // [20H, 02] размер мини-секторов в степени двойки;                                 // обычно 6 с указанием 64-байтовых мини-секторов     USHORT _usReserved;         // [22H, 02] зарезервировано, должно быть равно нулю     ULONG _ulReserved1;         // [24H, 04] зарезервировано, должно быть равно нулю     ФСИНДЕКС _csectDir;          // [28H, 04] должен быть равен нулю для 512-байтовых секторов,                                 // количество секций в цепочке каталогов на 4 КБ                                 // секторы     ФСИНДЕКС _csectFat;          // [2CH, 04] количество секций в цепочке FAT     РАЗДЕЛ _sectDirStart;         // [30H, 04] первый SECT в цепочке каталогов     ПОДПИСЬ _подпись;     // [34H, 04] подпись, используемая для транзакций; должен                                 // быть нулевым. Эталонная реализация                                 // не поддерживает транзакции     ULONG _ulMiniSectorCutoff;  // [38H, 04] максимальный размер мини-потока;                                 // обычно 4096 байт     РАЗДЕЛ _sectMiniFatStart;     // [3CH, 04] первый SECT в цепочке MiniFAT     ФСИНДЕКС _csectMiniFat;      // [40H, 04] количество секций в цепочке MiniFAT     РАЗДЕЛ _sectDifStart;         // [44H, 04] первый SECT в цепочке DIFAT     ФСИНДЕКС _csectDif;          // [48H, 04] количество секций в цепочке DIFAT     РАЗДЕЛ _sectFat[109];         // [4CH, 436] СЕКЦИИ первых 109 секторов FAT };

Секторы таблицы размещения файлов (FAT)

При объединении в единый поток совокупность секторов FAT определяет статус и связь каждого сектора в файле. Каждая запись в FAT имеет длину 4 байта и содержит номер следующего сектора в цепочке FAT или одно из следующих специальных значений:

  • FREESECT (0xFFFFFFFF) - обозначает неиспользуемый сектор
  • ENDOFCHAIN ​​(0xFFFFFFFE) - отмечает последний сектор в цепочке FAT
  • FATSECT (0xFFFFFFFD) - отмечает сектор, используемый для хранения части FAT
  • DIFSECT (0xFFFFFFFC) - отмечает сектор, используемый для хранения части DIFAT

Сектор блокировки диапазона

В Сектор блокировки диапазона должны существовать в файлах размером более 2 ГБ и не должны существовать в файлах размером менее 2 ГБ. Сектор блокировки диапазона должен содержать в файле диапазон байтов от 0x7FFFFF00 до 0x7FFFFFFF. Эта область зарезервирована реализацией Microsoft COM для хранения информации о блокировке диапазона байтов для одновременного доступа.

Глоссарий

  • ТОЛСТЫЙ - Таблица размещения файлов, также известная как: СИДЕЛ - Таблица распределения секторов
  • DIFAT - Таблица двойного косвенного размещения файлов
  • FAT Chain - группа записей FAT, которые указывают сектора, выделенные для потока в файле
  • Транслировать - виртуальный файл, который занимает несколько секторов в CFBF
  • Сектор - единица распределения в CFBF, обычно 512 или 4096 байт в длину

Смотрите также

Рекомендации

  1. ^ «Apache POI - POIFS». Проект POI. Архивировано из оригинал 26 апреля 2011 г.. Получено 10 мая 2011.
  2. ^ «Как конвертировать документы между форматами файлов LibreOffice и Microsoft Office в Linux». Архивировано из оригинал 21 сентября 2019 г.. Получено 25 ноября 2016.
  3. ^ «Составные файлы (Windows)». Библиотека Microsoft Developers Network (MSDN) - COM SDK. Корпорация Майкрософт. 20 ноября 2008 г.. Получено 23 сентября 2009.
  4. ^ «Контейнеры: составные файлы». Библиотека Microsoft Developers Network (MSDN) - документация Visual Studio 2008. Корпорация Майкрософт. Получено 23 сентября 2009.
  5. ^ «Понимание составных файлов». Библиотека Microsoft Developers Network (MSDN) - Управление правами ActiveDirectory. 25 июня 2009 г.. Получено 23 сентября 2009.
  6. ^ Ассоциация AMW (ранее Ассоциация AAF) В архиве 15 августа 2000 г. Wayback Machine

внешняя ссылка