El formato binario de archivo compuesto (CFBF), también llamado archivo compuesto , formato de documento compuesto [ 1] o archivo de documento compuesto V2 [2] (CDF), es un formato de archivo de documento compuesto para almacenar numerosos archivos y secuencias dentro de un solo archivo en un disco. CFBF es desarrollado por Microsoft y es una implementación de Microsoft COM Structured Storage . [3] [4] [5] El formato de archivo se utiliza para almacenar objetos de almacenamiento y objetos de secuencia en una estructura jerárquica dentro de un solo archivo. [6]
Microsoft ha abierto el formato para que lo utilicen otros y ahora se utiliza en una variedad de programas, desde Microsoft Word y Microsoft Access hasta Business Objects. [ cita requerida ] También forma la base del formato de creación avanzado . [ 7 ]
En su forma más simple, el formato binario de archivo compuesto es un contenedor, con pocas restricciones sobre lo que se puede almacenar dentro de él.
Una estructura de archivo CFBF se parece vagamente a un sistema de archivos FAT . El archivo está dividido en sectores que están encadenados entre sí con una tabla de asignación de archivos (que no debe confundirse con el sistema de archivos del mismo nombre) que contiene cadenas de sectores relacionados con cada archivo, un directorio contiene información para los archivos contenidos con un identificador de sector (SID) para el sector inicial de una cadena, y así sucesivamente.
El archivo CFBF consta de un registro de encabezado de 512 bytes seguido de una serie de sectores cuyo tamaño se define en el encabezado. La literatura define los sectores como de 512 o 4096 bytes de longitud, aunque el formato es potencialmente capaz de soportar sectores de tamaño que va desde 128 bytes en adelante en potencias de 2 (128, 256, 512, 1024, etc.). El límite inferior de 128 es el mínimo necesario para que quepa una sola entrada de directorio en un sector de directorio. [ ¿relevante? ]
Existen varios tipos de sectores que pueden estar presentes en un CFBF:
A continuación se ofrecen más detalles sobre el encabezado y cada tipo de sector.
El encabezado CFBF ocupa los primeros 512 bytes del archivo y la información necesaria para interpretar el resto del archivo. La declaración de estructura de estilo C que aparece a continuación (extraída de la Especificación de contenedores de bajo nivel de AAFA) muestra los miembros del encabezado CFBF y su propósito:
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 { // [desplazamiento desde el inicio (bytes), longitud (bytes)] BYTE _abSig [ 8 ]; // [00H,08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, // 0x1a, 0xe1} para la versión actual CLSID _clsid ; // [08H,16] reservado debe ser cero (WriteClassStg/ // GetClassFile usa el id de clase del directorio raíz) USHORT _uMinorVersion ; // [18H,02] versión secundaria del formato: 33 es // escrito por implementación de referencia USHORT _uDllVersion ; // [1AH,02] versión principal de la dll/formato: 3 para // sectores de 512 bytes, 4 para sectores de 4 KB USHORT _uByteOrder ; // [1CH,02] 0xFFFE: indica ordenamiento de bytes de Intel USHORT _uSectorShift ; // [1EH,02] tamaño de los sectores en potencia de dos; // normalmente 9 indica sectores de 512 bytes USHORT _uMiniSectorShift ; // [20H,02] tamaño de los minisectores en potencia de dos; // normalmente 6 indica minisectores de 64 bytes USHORT _usReserved ; // [22H,02] reservado, debe ser cero ULONG _ulReserved1 ; // [24H,04] reservado, debe ser cero FSINDEX _csectDir ; // [28H,04] debe ser cero para sectores de 512 bytes, // número de SECT en la cadena de directorios para sectores de 4 KB FSINDEX _csectFat ; // [2CH,04] número de SECT en la cadena FAT SECT _sectDirStart ; // [30H,04] primer SECT en la cadena de directorios DFSIGNATURE _signature ; // [34H,04] firma utilizada para transacciones; debe // ser cero. La implementación de referencia // no admite transacciones ULONG _ulMiniSectorCutoff ; // [38H,04] tamaño máximo para un mini stream; // típicamente 4096 bytes SECT _sectMiniFatStart ; // [3CH,04] primer SECT en la cadena MiniFAT FSINDEX _csectMiniFat ; // [40H,04] número de SECT en la cadena MiniFAT SECT _sectDifStart ; // [44H,04] primer SECT en la cadena DIFAT FSINDEX _csectDif ; // [48H,04] número de SECT en la cadena DIFAT SECT _sectFat [ 109 ]; // [4CH,436] los SECT de los primeros 109 sectores FAT };
Cuando se toman en conjunto como un flujo único, la colección de sectores FAT define el estado y el vínculo de cada sector en el archivo. Cada entrada en la FAT tiene una longitud de 4 bytes y contiene el número de sector del siguiente sector en una cadena FAT o uno de los siguientes valores especiales:
El sector de bloqueo de rango debe existir en archivos de más de 2 GB de tamaño y no debe existir en archivos de menos de 2 GB. El sector de bloqueo de rango debe contener el rango de bytes de 0x7FFFFF00 a 0x7FFFFFFF en el archivo. Esta área está reservada por la implementación COM de Microsoft para almacenar información de bloqueo de rango de bytes para acceso simultáneo.