複合二進制文檔(CFBF),也稱複合文檔,是微軟開發的一種實現COM結構化存儲的檔案格式,用於把多個對象內容存放在一個硬碟檔案里。
Microsoft已經開放了這個檔案格式。廣泛用於Microsoft Word與Microsoft Access。也是Advanced Authoring Format的基礎。
基本介紹
- 中文名:複合二進制文檔
- 外文名:CFBF
- 領域:計算機
- 性質:檔案格式
檔案結構,CFBF檔案頭,FAT扇區,辭彙表,COM結構化存儲,
檔案結構
CFBF檔案頭部是512位元組,隨後跟著是保存數據的扇區。扇區的長度在檔案頭部指定,通常是512位元組或4096位元組。
CFBF的扇區類型:
- FAT扇區
- MiniFAT扇區:用於Mini-Stream
- Double-Indirect FAT (DIFAT)扇區 - 包含FAT扇區索引的鍊表數據
- Directory扇區
- Stream扇區 - 包含數據內容
- Range Lock扇區 - 包含大檔案的上鎖的位元組範圍
CFBF檔案頭
CFBF頭是該檔案的最前的512位元組。對應於C語言數據結構為:
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 };
FAT扇區
每個FAT條目長度4位元組,包含下個FAT鍊表條目的扇區號,或下述特定值:
- FREESECT (0xFFFFFFFF) - 未用扇區
- ENDOFCHAIN (0xFFFFFFFE) - FAT鍊表最後一個扇區
- FATSECT (0xFFFFFFFD) - 用於FAT數據存儲
- DIFSECT (0xFFFFFFFC) - 用於DIFAT數據存儲
辭彙表
- FAT- 檔案分配表,也稱SAT- 扇區分配表
- DIFAT- Double-Indirect File Allocation Table
- FAT Chain- 一群FAT條目指出分配給一個流的那些扇區
- Stream- 一個數據對象的內容
- Sector- 扇區,占據512或4096個位元組
COM結構化存儲
COM結構化存儲(也稱“OLE結構化存儲”)是微軟在Windows作業系統上開發的一種技術,以在一個檔案記憶體儲層次化的數據。嚴格講,術語“structured storage”是指COM的一套接口。並提供了有限形式的原子事務數據訪問。
結構化存儲是為了解決在一個檔案中存放多個數據對象的本質性困難。當修改一個對象從而改變其尺寸時,如果這些對象在檔案內是順序存放的,則被修改對象的尺寸擴大時所有在其後的對象都需要向後移動以騰出空間,被修改對象縮小尺寸時所有在其後的對象都需要向前移動。這樣的困難有很多種辦法應對,但應用程式開發者並不希望處理這樣低層次的二進制檔案格式問題。
結構化存儲把檔案系統的概念引入到檔案內部。在檔案內部構造一個樹狀層次結構。由存儲對象和流對象構成。根節點為根存儲,根存儲下面可以有子存儲或流對象。子存儲下面可以再有子存儲或流對象。存儲對象本身不包含信息,它是子存儲和流對象的容器。流對象是葉子節點,是數據的載體。