Format binar cu fișier compus - Compound File Binary Format

Formatul binar de fișier compus (CFBF), numit și fișier compus , format document compus sau fișier document compus V2 Document (CDF), este un format de fișier de document compus pentru stocarea a numeroase fișiere și fluxuri într-un singur fișier pe un disc. CFBF este dezvoltat de Microsoft și reprezintă o implementare a Microsoft COM Structed Storage .

Microsoft a deschis formatul pentru a fi utilizat de alții, iar acum este folosit într-o varietate de programe de la Microsoft Word și Microsoft Access la obiecte de afaceri. De asemenea, constituie baza formatului avansat de autorizare .

Prezentare generală

Cel mai simplu, formatul binar al fișierului compus este un container, cu restricții reduse asupra a ceea ce poate fi stocat în el.

O structură de fișiere CFBF seamănă mai degrabă cu un sistem de fișiere FAT . Fișierul este partiționat în Sectoare care sunt înlănțuite împreună cu o tabelă de alocare a fișierelor (nu trebuie confundat cu sistemul de fișiere cu același nume) care conține lanțuri de sectoare legate de fiecare fișier, un director conține informații pentru fișierele conținute cu un ID de sector (SID) pentru sectorul de pornire a unui lanț și așa mai departe.

Structura

Fișierul CFBF constă dintr-o înregistrare de antet de 512 octeți, urmată de o serie de sectoare a căror dimensiune este definită în antet. Literatura definește Sectoarele fie 512 sau 4096 octeți în lungime, deși formatul este capabil să sprijine sectoarele cu dimensiuni de la 128 de octeți în sus, cu puteri de 2 (128, 256, 512, 1024, etc.). Limita inferioară de 128 este minimul necesar pentru a se încadra într-o singură intrare de director într-un sector de director.

Există mai multe tipuri de sectoare care pot fi prezente într-o CFBF:

  • Sectorul de alocare a fișierelor (FAT) - conține lanțuri de indici de sector la fel cum o face FAT în sistemele de fișiere FAT / FAT32
  • Sectoare MiniFAT - asemănătoare cu FAT, dar care păstrează lanțuri de mini-sectoare în cadrul Mini-Stream
  • Sectorul FAT dublu-indirect (DIFAT) - conține lanțuri de indici de sector FAT
  • Sectorul directorului - conține intrări în director
  • Sectorul de flux - conține date de fișier arbitrare
  • Range Lock Sector - conține zona de blocare a intervalului de byte a unui fișier mare

Mai multe detalii sunt prezentate mai jos pentru antetul și fiecare tip de sector.

Formatul antetului CFBF

Antetul CFBF ocupă primii 512 octeți ai fișierului și informațiile necesare pentru interpretarea restului fișierului. Declarația de structură în stil C de mai jos (extrasă din Specificația Containerului de nivel scăzut AAFA) arată membrii antetului CFBF și scopul acestora:

 typedef unsigned long ULONG;    // 4 Bytes
 typedef unsigned short USHORT;  // 2 Bytes
 typedef short OFFSET;           // 2 Bytes
 typedef ULONG SECT;             // 4 Bytes
 typedef ULONG FSINDEX;          // 4 Bytes
 typedef USHORT FSOFFSET;        // 2 Bytes
 typedef USHORT WCHAR;           // 2 Bytes
 typedef ULONG DFSIGNATURE;      // 4 Bytes
 typedef unsigned char BYTE;     // 1 Byte
 typedef unsigned short WORD;    // 2 Bytes
 typedef unsigned long DWORD;    // 4 Bytes
 typedef ULONG SID;              // 4 Bytes
 typedef GUID CLSID;             // 16 Bytes

 struct StructuredStorageHeader { // [offset from start (bytes), length (bytes)]
     BYTE _abSig[8];             // [00H,08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1,
                                 // 0x1a, 0xe1} for current version
     CLSID _clsid;               // [08H,16] reserved must be zero (WriteClassStg/
                                 // GetClassFile uses root directory class id)
     USHORT _uMinorVersion;      // [18H,02] minor version of the format: 33 is
                                 // written by reference implementation
     USHORT _uDllVersion;        // [1AH,02] major version of the dll/format: 3 for
                                 // 512-byte sectors, 4 for 4 KB sectors
     USHORT _uByteOrder;         // [1CH,02] 0xFFFE: indicates Intel byte-ordering
     USHORT _uSectorShift;       // [1EH,02] size of sectors in power-of-two;
                                 // typically 9 indicating 512-byte sectors
     USHORT _uMiniSectorShift;   // [20H,02] size of mini-sectors in power-of-two;
                                 // typically 6 indicating 64-byte mini-sectors
     USHORT _usReserved;         // [22H,02] reserved, must be zero
     ULONG _ulReserved1;         // [24H,04] reserved, must be zero
     FSINDEX _csectDir;          // [28H,04] must be zero for 512-byte sectors,
                                 // number of SECTs in directory chain for 4 KB
                                 // sectors
     FSINDEX _csectFat;          // [2CH,04] number of SECTs in the FAT chain
     SECT _sectDirStart;         // [30H,04] first SECT in the directory chain
     DFSIGNATURE _signature;     // [34H,04] signature used for transactions; must
                                 // be zero. The reference implementation
                                 // does not support transactions
     ULONG _ulMiniSectorCutoff;  // [38H,04] maximum size for a mini stream;
                                 // typically 4096 bytes
     SECT _sectMiniFatStart;     // [3CH,04] first SECT in the MiniFAT chain
     FSINDEX _csectMiniFat;      // [40H,04] number of SECTs in the MiniFAT chain
     SECT _sectDifStart;         // [44H,04] first SECT in the DIFAT chain
     FSINDEX _csectDif;          // [48H,04] number of SECTs in the DIFAT chain
     SECT _sectFat[109];         // [4CH,436] the SECTs of first 109 FAT sectors
 };

Sectoare tabel alocare fișiere (FAT)

Când sunt luate împreună ca un singur flux, colecția de sectoare FAT definește starea și legătura fiecărui sector din fișier. Fiecare intrare din FAT are o lungime de 4 octeți și conține numărul sectorului următorului sector dintr-un lanț FAT sau una dintre următoarele valori speciale:

  • FREESECT (0xFFFFFFFF) - denotă un sector neutilizat
  • ENDOFCHAIN ​​(0xFFFFFFFE) - marchează ultimul sector dintr-un lanț FAT
  • FATSECT (0xFFFFFFFD) - marchează un sector folosit pentru stocarea unei părți din FAT
  • DIFSECT (0xFFFFFFFC) - marchează un sector folosit pentru stocarea unei părți din DIFAT

Sectorul de blocare a intervalului

De blocare Sectorul Range trebuie să existe în fișiere mai mari de 2 GB în dimensiune, și nu trebuie să existe în fișiere mai mici de 2 GB. Sectorul de blocare a intervalului trebuie să conțină intervalul de octeți 0x7FFFFF00 până la 0x7FFFFFFF în fișier. Această zonă este rezervată de implementarea COM a Microsoft pentru stocarea informațiilor de blocare a octeților pentru acces simultan.

Glosar

  • FAT - Tabel de alocare fișiere, cunoscut și sub numele de: SAT - Tabel de alocare sectorială
  • DIFAT - Tabel de alocare fișier dublu-indirect
  • Lanț FAT - un grup de intrări FAT care indică sectoarele alocate unui flux din fișier
  • Stream - un fișier virtual care ocupă o serie de sectoare din CFBF
  • Sector - unitatea de alocare în cadrul CFBF, de obicei 512 sau 4096 octeți lungime

Vezi si

Referințe

linkuri externe