* CAB 포맷은 MS 에서 만든 압축 포맷이다.

* cab 은 cabinet 의 약자이다.

* cab 파일의 구조는 다음과 같다.

==== 

CFHEADER - CAB 헤더

====

CFFOLDER-1 - 폴더 , CFDATA 1-1 위치정보 . 하나의 폴더에 여러개의 DATA 블럭이 속한다.
CFFOLDER-2 CFDATA 1-2 위치정보
..
CFFOLDER-n

====

CFFILE-1 - 파일 정보 : 파일에 대한 정보와, 파일의 압축 데이타가 어떤 폴더, 어느 옵셋에 속하는지에 대한 정보가 있다
CFFILE-2                      하나의 파일은 여러개의 폴더에 걸칠 수 없다..
..
CFFILE-n

====

CFDATA 1-1 - 실제 압축 데이타 . 데이타 블럭은 각각 개별적으로 압축되었을 수도 있고, 연속적인 압축데이타 일수도 있다.
CFDATA 1-2
..
CFDATA 1-m


CFDATA 2-1
CFDATA 2-2
..
CFDATA 2-m

...


CFDATA n-1
CFDATA n-2
..
CFDATA n-m


==== 

- 내부적으로 폴더(디렉토리 개념이 아니라, 여러 데이타 블럭의 묶음 개념) 라는 이름으로 파일을 묶어 놓았고, 각각의 파일은 솔리드 압축되어 있고 솔리드 데이타는 cfdata 라는 데이타 블럭에 쪼개져서 존재한다.

* cab 파일은 압축을 안하는 경우를 제외하고는 solid 압축된다. 근데 그냥 솔리드 압축이 아니라, 압축 알고리즘에 따라서 여러 데이타 블럭에 걸쳐 있기도 하고...그렇다.

* cab 은 mszip, lzx, quantum 알고리즘을 지원한다.

* mszip 알고리즘은 deflate 알고리즘을 그대로 사용하기는 하는데, 매 블럭마다 허프만 트리를 초기화 시키는 방식으로 작동한다. 트리는 초기화 시키지만 lz77 윈도우는 유지시킨다.

* lzx 알고리즘은 lz77 + huffman 뭐 그런 알고리즘인데 deflate 가 64k 윈도우를 가지는 반면 lzx 는 2M 까지 윈도우를 가질 수 있다. 여기에 x86 실행파일의 call 명령에 대한 효율적인 처리가 들어가 있나다 뭐나.... 좌우지간 program files 의 폴더 하나를 압축해 본 결과 zip 보다 20% 정도 파일크기가 더 작게 나오는걸 확인했다. 확실히 실행파일 압축은 deflate 보다 뛰어난듯.

* quantum 알고리즘은 뭔지 모르겠다. cab 파일은 cabarc.exe 로 만들 수 있는데 이놈은 quantum 알고리즘의 파일을 생성하지 않는다.

* cab 파일의 압축 파일을 처리하는 오픈 소스는 7zip 과 libmspack 이 있는데 둘다 lgpl 이다. 근데 libmspack 은 static linking 이 가능하다. (홈페이지 라이선스 참고)


좌우지간 파일 처리 모듈 코딩하면서 느낀게 cab 포맷은 압축 포맷중 제일 드러운 포맷인듯. 
그래도 (정확한 데이타를 찾을수는 없었지만..) 아마도 rar 보다 처음으로 solid 압축을 지원한 포맷인듯 하니 지저분해도 이해해야지.

==============

2010/9/30 추가

추가적으로 작업을 하다보니 다른 특성도 하나 더 나왔다. CAB 파일은 압축하려는 파일중에 동일한 파일 (그러니까 파일 내용은 똑같은데 파일명이나 경로가 다른경우) 은 하나로 묶어서 처리를 하는 기능이 있다.  AAA.TXT 랑 BBB.TXT 가 내용이 똑같으면 압축데이타 위치를 똑같은데를 가르키는 것이다.  ISO 나 WIM 도 이런 특성이 있어서 파일의 압축을 풀면 무지 큰 파일이 나오는 경우가 있다. ( WINDOWS 2000 WOW 뭐 그런거 ) 

문제는 CAB 이 솔리드 압축이라서 이런 파일을 처리하기가 무지 골치아프다는거... 


Posted by 키플러
,