복합 파일 이진 형식
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
복합 파일 이진 형식은 헤더와 섹터로 구성되며, 섹터는 파일 할당 테이블, 디렉터리 배열, 사용자 스트림 등을 저장하는 단위이다. CFBF 파일은 512바이트 헤더 레코드로 시작하며, 여러 유형의 섹터(FAT, MiniFAT, DIFAT, 디렉터리, 스트림, 범위 잠금)를 포함한다. 이 형식은 마이크로소프트 워드, 한/글과 같은 프로그램에서 사용되었으나, 이진 파일 형식의 한계로 인해 최근에는 XML 기반 형식으로 전환되는 추세이다. 마이크로소프트의 IStorage 및 IStream 인터페이스, 그놈의 libgsf 라이브러리를 통해 관련 API를 제공한다.
더 읽어볼만한 페이지
- 컨테이너 포맷 - 오디오 비디오 인터리브
오디오 비디오 인터리브(AVI)는 마이크로소프트가 개발한 멀티미디어 컨테이너 포맷으로, RIFF 파일 형식의 하위 분류에 속하며 다양한 코덱을 사용하여 오디오/비디오 데이터를 저장하고 동영상 파일을 구성하는 데 활용된다. - 컨테이너 포맷 - WAV
WAV는 IBM과 마이크로소프트가 정의한 RIFF를 기반으로 하는 오디오 파일 형식으로, 주로 비압축 오디오인 LPCM 형식을 사용하며 윈도우 운영 체제에서 기본적으로 지원되고 전문적인 오디오 작업 및 방송국에서 표준 오디오 포맷으로 사용된다. - 파일 포맷 - 바로 가기
바로 가기는 운영체제에서 파일, 폴더, 프로그램, 웹 페이지에 대한 참조를 제공하는 기능 및 파일로, 사용자들이 원본에 빠르게 접근하도록 GUI 환경의 사용성을 향상시킨다. - 파일 포맷 - EXE
EXE 파일 형식은 운영 체제에 따라 다양한 종류가 있는 실행 파일의 한 형태로, DOS MZ 실행 파일에서 PE, PE32+까지 발전해 왔으며, 코드, 데이터, 스택을 별도 관리하고 재배치 항목을 통해 실행 환경에 유연하게 대응하는 특징을 가진다.
복합 파일 이진 형식 | |
---|---|
파일 포맷 정보 | |
종류 | 복합 문서 파일 포맷 |
개발 | 마이크로소프트 |
확장자 | .doc .xls .ppt .msg 기타 |
MIME 형식 | application/octet-stream |
상세 정보 | |
유형 코드 | OLE |
컨테이너 | 파일 시스템 |
포함 | 스트림과 저장소 |
파생됨 | 액티브 문서 |
기반 | OLE |
사용 | 마이크로소프트 오피스 기타 OLE 기반 프로그램 |
추가 정보 | |
설명 | 복합 파일 이진 포맷 (Compound File Binary Format)은 여러 스트림과 저장소를 단일 파일에 저장하는 데 사용되는 파일 포맷이다. |
역사 | 마이크로소프트에서 개발되었으며, 이전에는 OLE 복합 문서 포맷으로 알려졌다. |
특징 | 파일 시스템과 유사한 구조를 가진다. 여러 종류의 데이터를 효율적으로 관리할 수 있다. 액티브X 기술과 함께 사용되어 다양한 기능을 제공한다. |
호환성 | 다양한 마이크로소프트 응용 프로그램 및 기타 소프트웨어에서 지원된다. |
2. 구조
복합 파일은 하나의 헤더와 다수의 섹터로 구성된다. 섹터는 파일 할당 테이블, 디렉터리 배열, 사용자 스트림 등의 정보를 저장하는 기본 단위이다. 복합 파일을 여는 과정은 파일 시작 부분의 헤더 정보를 읽어 파일 할당 테이블(FAT)과 디렉터리 배열을 구성하고, 이를 이용해 실제 사용자 데이터가 담긴 스트림을 조립하는 방식으로 이루어진다.
사용자 스트림과 스토리지는 복합 파일 내에서 사용자가 직접 상호작용하는 단위이다.
- '''스트림'''은 프로그램이 사용하는 데이터를 저장하는 공간으로, 일반적인 파일 시스템의 파일에 해당한다.
- '''스토리지'''는 스트림을 분류하고 관리하는 역할을 하며, 파일 시스템의 디렉터리와 유사하다. 스토리지는 다른 스토리지를 포함하여 계층 구조를 이룰 수 있다.
모든 스트림과 스토리지는 최상위 스토리지인 '루트 엔트리' 아래에 포함된다. 루트 엔트리는 스토리지인 동시에, 64바이트 크기의 섹터들을 저장하는 특별한 스트림이기도 하다. 본질적으로 복합 파일은 다양한 종류의 데이터를 담을 수 있는 컨테이너이며, 내부에 저장할 수 있는 내용에는 거의 제한이 없다.
복합 파일의 구조는 FAT 파일 시스템과 여러 면에서 유사하다. 파일은 정해진 크기의 '섹터'로 나뉘며, '파일 할당 테이블'(FAT, 파일 시스템의 FAT와는 구별됨)이 각 스트림(파일)을 구성하는 섹터들의 연결 정보(체인)를 관리한다. '디렉터리' 섹터는 각 스트림과 스토리지의 이름, 유형, 시작 섹터 위치 등의 정보를 저장한다.
복합 파일은 512바이트 크기의 헤더 레코드로 시작하며, 그 뒤를 헤더에 정의된 크기의 여러 섹터가 따른다. 문헌에서는 주로 512바이트 또는 4096바이트(4KB) 크기의 섹터를 언급하지만, 형식 자체는 128바이트부터 시작하여 2의 거듭제곱(128, 256, 512, 1024 등) 형태의 다양한 섹터 크기를 지원할 수 있다. 128바이트는 디렉터리 섹터에 최소 하나의 디렉터리 항목을 저장하는 데 필요한 크기이다.
복합 파일 내에는 다음과 같은 여러 유형의 섹터가 존재하며, 각각 특정 목적을 위해 사용된다. 각 섹터 유형에 대한 자세한 설명은 해당 하위 섹션에서 확인할 수 있다.
- 파일 할당 테이블(FAT) 섹터: FAT/FAT32 파일 시스템의 FAT처럼 섹터 인덱스의 체인을 포함한다.
- MiniFAT 섹터: FAT와 유사하지만, 작은 스트림(Mini-Stream)을 구성하는 미니 섹터(mini-sector)의 체인을 저장한다.
- 이중 간접 FAT(DIFAT) 섹터: FAT 섹터 자체의 위치를 가리키는 인덱스 체인을 포함한다. 파일이 매우 커서 FAT 정보가 여러 섹터에 나뉘어 저장될 때 사용된다.
- 디렉터리 섹터: 스트림과 스토리지의 이름, 속성, 시작 위치 등 디렉터리 항목 정보를 포함한다.
- 스트림 섹터: 실제 사용자 데이터(파일 내용)를 포함한다.
- 범위 잠금 섹터: 매우 큰 파일에서 특정 바이트 범위의 동시 접근을 제어하기 위한 잠금 정보를 포함한다.
2. 1. 헤더
복합 파일 이진 형식(CFBF) 헤더는 파일의 시작 부분 512바이트를 차지하며, 파일의 나머지 부분을 해석하는 데 필요한 정보를 담고 있다. 헤더의 구조는 다음과 같다.오프셋 (바이트) | 크기 (바이트) | 필드명 | 설명 |
---|---|---|---|
0x00 | 8 | `_abSig` | 시그니처. 현재 버전은 `{0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1}` 값을 가진다. 이 값은 CFBF 파일을 식별하는 데 사용된다. |
0x08 | 16 | `_clsid` | 예약됨. 모든 비트는 0이어야 한다. 루트 스토리지 객체의 클래스 식별자(CLSID)를 저장하는 데 사용될 수 있다. |
0x18 | 2 | `_uMinorVersion` | 형식의 마이너 버전. 참조 구현에서는 33(0x0021)으로 기록된다. |
0x1A | 2 | `_uDllVersion` | 형식의 메이저 버전. 512바이트 섹터의 경우 3(0x0003), 4KB 섹터의 경우 4(0x0004)이다. |
0x1C | 2 | `_uByteOrder` | 바이트 순서 표시자. `0xFFFE` 값은 리틀 엔디언(Intel) 바이트 순서를 나타낸다. 이는 권장되는 값이다. `0xFEFF` 값은 빅 엔디언 바이트 순서를 나타낸다. |
0x1E | 2 | `_uSectorShift` | 섹터 크기를 2의 거듭제곱으로 나타낸 값. 일반적으로 9이며, 이는 섹터 크기가 29 = 512 바이트임을 의미한다. 메이저 버전이 4인 경우 이 값은 12여야 하며, 이는 섹터 크기가 212 = 4096 바이트임을 의미한다. |
0x20 | 2 | `_uMiniSectorShift` | 미니 섹터 크기를 2의 거듭제곱으로 나타낸 값. 일반적으로 6이며, 이는 미니 섹터 크기가 26 = 64 바이트임을 의미한다. |
0x22 | 2 | `_usReserved` | 예약됨. 반드시 0이어야 한다. |
0x24 | 4 | `_ulReserved1` | 예약됨. 반드시 0이어야 한다. |
0x28 | 4 | `_csectDir` | 디렉터리 섹터 체인에 있는 섹터 수. 메이저 버전이 3인 경우(512바이트 섹터) 이 필드는 사용되지 않으며 0이어야 한다. 4KB 섹터 파일에서 사용된다. |
0x2C | 4 | `_csectFat` | 파일 할당 테이블(FAT) 체인에 있는 섹터 수. |
0x30 | 4 | `_sectDirStart` | 디렉터리 체인의 시작 섹터 번호. |
0x34 | 4 | `_signature` | 트랜잭션 서명에 사용되는 필드. 트랜잭션 접근 모드를 지원하지 않는 구현에서는 반드시 0이어야 한다. 참조 구현은 트랜잭션을 지원하지 않는다. |
0x38 | 4 | `_ulMiniSectorCutoff` | 미니 스트림의 최대 크기(바이트 단위). 일반적으로 4096 바이트이다. 이 크기보다 큰 스트림은 일반 섹터를 사용하여 저장되며, 미니 FAT 대신 FAT를 통해 할당된다. |
0x3C | 4 | `_sectMiniFatStart` | 미니 FAT 체인의 시작 섹터 번호. 미니 스트림이 없으면 `ENDOFCHAIN` (0xFFFFFFFF) 값을 가진다. |
0x40 | 4 | `_csectMiniFat` | 미니 FAT 체인에 있는 섹터 수. |
0x44 | 4 | `_sectDifStart` | DIFAT(Double Indirect File Allocation Table) 체인의 시작 섹터 번호. DIFAT 섹터가 없으면 `ENDOFCHAIN` (0xFFFFFFFF) 값을 가진다. |
0x48 | 4 | `_csectDif` | DIFAT 체인에 있는 섹터 수. |
0x4C | 436 | `_sectFat[109]` | 파일의 FAT 섹터 목록 중 처음 109개 항목을 담는 배열. 각 항목은 FAT 섹터의 번호이다. DIFAT를 사용하지 않는 경우, 이 배열에는 모든 FAT 섹터의 위치가 포함된다. DIFAT를 사용하는 경우, 이 배열과 DIFAT 섹터에 나머지 FAT 섹터 위치가 포함된다. 사용되지 않는 배열 항목은 `FREESECT` (0xFFFFFFFF) 값을 가진다. |
2. 2. 파일 할당 테이블 (FAT) 섹터
파일 할당 테이블(FAT) 섹터는 FAT/FAT32 파일 시스템의 파일 할당 테이블과 유사하게, 섹터 인덱스의 체인을 포함한다.FAT 섹터들을 하나의 스트림으로 묶으면, 이 섹터들의 모음은 파일 내 모든 섹터의 상태와 연결을 정의한다. FAT의 각 항목은 4바이트 길이이며, FAT 체인의 다음 섹터 번호 또는 다음 특수 값 중 하나를 포함한다.
- '''FREESECT''' (0xFFFFFFFF): 사용되지 않은 섹터를 나타낸다.
- '''ENDOFCHAIN''' (0xFFFFFFFE): FAT 체인의 마지막 섹터를 표시한다.
- '''FATSECT''' (0xFFFFFFFD): FAT의 일부를 저장하는 데 사용되는 섹터를 표시한다.
- '''DIFSECT''' (0xFFFFFFFC): DIFAT의 일부를 저장하는 데 사용되는 섹터를 표시한다.
관련 용어는 다음과 같다.
용어 | 설명 |
---|---|
FAT (파일 할당 테이블, File Allocation Table) / SAT (Sector Allocation Table) | 섹터 할당 정보를 담고 있는 테이블 |
DIFAT (Double-Indirect File Allocation Table) | 이중 간접 파일 할당 테이블. FAT 섹터의 위치 정보를 담는다. |
FAT 체인 | 파일 내 스트림에 할당된 섹터들을 나타내는 FAT 항목 그룹 |
스트림 | 복합 파일 이진 형식(CFBF) 내에서 여러 섹터를 차지하는 가상 파일 |
섹터 | CFBF 내 할당 단위, 일반적으로 길이가 512 또는 4096 바이트 |
2. 3. MiniFAT 섹터
MiniFAT 섹터는 FAT와 유사한 역할을 수행하지만, Mini-Stream 내에 있는 미니 섹터(mini-sector)들의 체인을 저장하는 데 특화되어 있다. 이는 상대적으로 크기가 작은 스트림 데이터를 효율적으로 관리하기 위한 목적으로 사용된다.2. 4. 이중 간접 FAT (DIFAT) 섹터
CFBF 파일 내에는 여러 유형의 섹터가 존재하는데, 그중 하나가 이중 간접 FAT(DIFAT) 섹터이다.[1] DIFAT는 '이중 간접 파일 할당 테이블'(Double-Indirect File Allocation Table영어)의 약자이다.[2] 이 섹터는 FAT 섹터의 인덱스 체인을 포함하는 역할을 한다.[1] 즉, 파일 시스템이 많은 수의 FAT 섹터를 관리해야 할 때, 이를 간접적으로 찾아갈 수 있도록 도와주는 주소 목록과 같은 기능을 수행한다.2. 5. 디렉터리 섹터
디렉터리 섹터는 복합 파일 이진 형식 내에서 디렉터리 항목들을 담는 역할을 하는 섹터 유형이다. 복합 파일 구조에서 스토리지는 일반적인 파일 시스템의 디렉터리와 유사한 역할을 하고, 스트림은 파일에 해당한다. 스토리지는 다른 스토리지를 포함할 수 있으며, 모든 스트림과 스토리지는 최상위 스토리지인 '루트 엔트리' 아래에 계층적으로 구성된다. 디렉터리 섹터는 이러한 계층 구조 정보와 각 스토리지 및 스트림의 속성 정보를 저장하는 디렉터리 항목들을 포함한다.복합 파일을 열 때는 헤더 정보를 이용해 파일 할당 테이블(FAT)과 함께 디렉터리 배열을 만드는데, 이 디렉터리 배열은 디렉터리 섹터에 저장된 정보를 기반으로 구성된다.
하나의 디렉터리 항목을 저장하기 위해서는 최소 128바이트의 공간이 필요하며, 이는 복합 파일에서 지원하는 가장 작은 섹터 크기이기도 하다.
2. 6. 스트림 섹터
복합 파일 이진 형식(CFBF)에서 '''스트림 섹터'''(Stream Sector)는 실제 사용자 데이터를 저장하는 데 사용되는 섹터의 한 종류이다. CFBF 내에서 스트림은 여러 섹터에 걸쳐 저장되는 일종의 가상 파일 개념인데, 이 스트림을 구성하는 실제 데이터 조각들이 바로 스트림 섹터에 담긴다.[1] 사용자가 워드 프로세서 문서, 스프레드시트 파일 등 특정 프로그램을 통해 저장하는 내용은 이러한 스트림 섹터들에 나뉘어 기록된다.[2]각 스트림 섹터의 크기는 파일 헤더에 정의되며, 일반적으로 512바이트 또는 4096바이트 크기를 가지지만, 이론적으로는 128바이트부터 시작하여 2의 거듭제곱 형태(예: 256, 512, 1024 바이트 등)로 다양하게 설정될 수 있다.[3] 어떤 스트림이 어떤 섹터들로 구성되어 있는지, 그리고 그 순서는 어떻게 되는지에 대한 정보는 파일 할당 테이블(FAT) 섹터나 MiniFAT 섹터에 의해 관리된다.[3][1]
2. 7. 범위 잠금 섹터
범위 잠금 섹터는 파일 크기가 2GB를 초과하는 CFBF 파일에 반드시 존재해야 하며, 2GB보다 작은 파일에는 존재하지 않아야 한다. 이 섹터는 파일 내에서 바이트 범위 0x7FFFFF00부터 0x7FFFFFFF까지를 포함해야 한다. 해당 영역은 마이크로소프트의 COM 구현에서 동시 접근을 위한 바이트 범위 잠금 정보를 저장하기 위해 예약되어 있다.3. 구성 요소
복합 파일은 하나의 헤더와 다수의 섹터로 구성된다. 섹터는 파일 할당 테이블(FAT), 디렉터리 배열, 사용자 데이터 등을 저장하는 기본 단위이다. 복합 파일을 여는 과정은 헤더 정보를 이용해 FAT와 디렉터리 배열을 구성하고, 이를 통해 사용자 데이터를 찾는 방식으로 이루어진다.
복합 파일 이진 형식(CFBF)의 구조는 FAT 파일 시스템과 유사한 면이 있다. 파일 데이터는 여러 섹터로 나뉘어 저장되며, 파일 할당 테이블(FAT)이 각 데이터에 속한 섹터들의 연결 정보를 가지고 있다. 디렉터리는 포함된 데이터(스트림 또는 스토리지)의 시작 섹터 ID(SID) 등의 정보를 저장한다.
CFBF 파일은 512바이트 크기의 헤더 레코드와 그 뒤를 따르는 여러 섹터로 이루어진다. 섹터의 크기는 헤더에 정의되며, 주로 512바이트 또는 4096바이트가 사용되지만, 이론적으로는 128바이트부터 2의 거듭제곱 크기(128, 256, 512, 1024 등)를 지원할 수 있다. 128바이트는 디렉터리 섹터에 최소 하나의 디렉터리 항목을 저장하기 위한 최소 크기이다.
복합 파일 내에는 다양한 종류의 섹터가 존재한다.
- 파일 할당 테이블(FAT) 섹터: 섹터 인덱스의 연결 정보를 포함한다.
- MiniFAT 섹터: 작은 데이터(Mini-Stream)를 위한 MiniFAT 정보를 저장한다.
- 이중 간접 FAT(DIFAT) 섹터: FAT 섹터 자체의 위치 정보를 담는다.
- 디렉터리 섹터: 디렉터리 항목들을 포함한다.
- 스트림 섹터: 실제 사용자 데이터를 저장한다.
- 범위 잠금 섹터: 대용량 파일의 특정 영역 잠금 정보를 포함한다.
3. 1. 스토리지
사용자 스트림은 스토리지와 함께 복합 파일을 이루는 중요한 구성 요소이다. 복합 파일을 이용하는 프로그램은 자신의 데이터를 사용자 스트림에 저장한다. 이 스트림들은 스토리지 안에 포함되어 관리되며, 스토리지는 또 다른 스토리지 안에 들어갈 수 있는 계층 구조를 가진다.이러한 구조 때문에 복합 파일 내의 스트림과 스토리지는 일반적인 파일 시스템에서의 파일과 디렉터리에 각각 비유할 수 있다. 즉, 스트림은 실제 데이터가 담긴 파일과 같고, 스토리지는 이러한 파일(스트림)이나 다른 폴더(스토리지)를 담는 폴더와 같은 역할을 한다.
모든 스트림과 스토리지는 '루트 엔트리'라고 불리는 최상위 스토리지 아래에 존재한다. 이 루트 엔트리는 가장 기본적인 스토리지이면서, 동시에 64바이트 크기의 작은 섹터들을 저장하는 특별한 스트림의 역할도 수행한다.
3. 2. 스트림
사용자 스트림은 스토리지와 함께 복합 파일을 이루는 기본 단위로, 복합 파일을 이용하는 프로그램이 자신의 자료를 저장하는 곳이다.[1] 마치 일반적인 파일 시스템에서 파일이 디렉터리 안에 속하는 것처럼, 스트림은 스토리지에 소속되어 분류되며, 스토리지는 또 다른 스토리지에 속할 수 있다. 모든 스트림과 스토리지는 '루트 엔트리'라고 불리는 최상위 스토리지 아래에 계층적으로 구성된다.[1]스트림은 복합 파일 내에서 여러 섹터를 차지하는 가상의 파일이다.[2] 스트림에 저장되는 실제 데이터는 임의의 파일 데이터를 포함하는 '스트림 섹터'에 담긴다.[3] 스트림에 할당된 섹터들은 파일 할당 테이블(FAT) 내의 'FAT 체인'이라는 항목 그룹을 통해 연결되어 관리된다.[2][3]
3. 3. 루트 엔트리
복합 파일 내의 모든 스트림과 스토리지는 루트 엔트리라고 불리는 최상위 스토리지에 포함된다. 스트림은 실제 사용자 데이터가 저장되는 단위이며, 스토리지는 이러한 스트림이나 다른 스토리지를 담아 분류하는 역할을 한다. 이는 일반적인 파일 시스템에서 파일과 디렉터리의 관계와 유사하다고 볼 수 있다.루트 엔트리는 이러한 계층 구조의 최상단에 위치하는 기본적인 스토리지이다. 동시에 루트 엔트리 자체는 64바이트 크기의 섹터들을 저장하는 특별한 스트림이기도 하다. 즉, 루트 엔트리는 복합 파일 전체의 구조를 아우르는 시작점이자, 기본적인 데이터 저장 단위로서의 역할도 수행한다.
4. 프로그램
마이크로소프트의 워드 97 이후 버전에서 사용하는 .doc 파일 형식과 한글과컴퓨터의 한/글 워디안 이후 버전에서 사용하는 .hwp 파일 형식이 대표적인 복합 파일 이진 형식이다.[1] 그러나 이진 파일 형식은 서로 다른 운영 체제나 기기 환경에서 파일을 공유하거나 사용하기 어렵다는 단점이 있다.[1] 이러한 문제 때문에 최근에는 XML 기술을 기반으로 하는 오피스 오픈 XML, 오픈도큐먼트, HWPML과 같은 개방형 문서 형식을 사용하는 경향이 늘어나고 있다.[1]
5. 관련 API
참조
[1]
웹사이트
Apache POI – POIFS
https://web.archive.[...]
POI Project
2011-05-10
[2]
웹사이트
How to convert documents between LibreOffice and Microsoft Office file formats on Linux
https://web.archive.[...]
2016-11-25
[3]
웹사이트
Compound Files (Windows)
http://msdn.microsof[...]
Microsoft Corporation
2009-09-23
[4]
웹사이트
Containers: Compound Files
http://msdn.microsof[...]
Microsoft Corporation
2009-09-23
[5]
웹사이트
Understand Compound Files
http://msdn.microsof[...]
2009-09-23
[6]
웹사이트
Microsoft Compound File Binary File Format, Version 4
https://www.loc.gov/[...]
2024-06-13
[7]
웹사이트
AMW Association (formerly AAF Association)
http://www.aafassoci[...]
[8]
웹인용
Apache POI - POIFS
https://web.archive.[...]
POI Project
2011-05-10
[9]
웹인용
How to convert documents between LibreOffice and Microsoft Office file formats on Linux
https://web.archive.[...]
2016-11-25
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com