XInflate

소개

Deflate는 ZIP 압축 파일 포맷에 사용하기 위해서 Phil Katz가 개발한 압축 알고리즘입니다. 보통 이 알고리즘으로 압축된 데이터를 다시 원래대로 압축을 해제하는걸 Inflate 라고 부릅니다. XInflate 는 Deflate 압축 알고리즘의 압축해제만을 위해서 만들어진 오픈 소스 라이브러리입니다.

다운로드

소스 이력

2010/04/05 개발 시작

2010/04/30 최초 공개(1.0)

2010/05/25 1.1 업데이트

  • 허프만 탐색 알고리즘 개선 및 최적화로 속도 향상 (2배정도 빨라짐)
  • 불필요한 코드 제거
  • 출력 버퍼를 외부에서 지정한 버퍼를 이용할 수 있도록 기능 추가
  • 자잘한 버그 수정

실행 화면

본 압축파일에는 xinflate 소스 및 gzip 파일의 압축해제 기능을 가진 xgunzip 프로그램이 예제 소스로 포함되어 있습니다. 아래 그림은 xgunzip 을 이용해서 gzip 파일의 압축을 해제하는 모습입니다.

 

참고 링크

본 라이브러리는 다음과 같은 자료를 참고하였습니다.

벤치마크

XInflate 의 성능을 테스트해보기 위해서 임의의 gzip 으로 압축한 파일을 zlib, halibut(에 포함된 deflate.c), xinflate 로 각각 압축을 해제하는 속도를 측정하여 보았습니다. 테스트는 디스크 IO에 영향을 받지 않게 하기 위해서 압축 해제만을 수행하고 디스크로 파일을 쓰는 과정을 생략하였으며, 각 3번씩 수행을 한 결과입니다. 테스트 환경은 Q9400CPU, Windows7입니다.

실행파일을 압축한 34.5MB 짜리 gzip 파일

  • zlib : 640ms
  • Halibut : 1750ms
  • XInflate : 840ms

실행파일을 압축한 142MB 짜리 gzip 파일

  • zlib : 1200ms
  • Halibut : 4100ms
  • XInflate : 1800ms

1.0 버전에서는 zlib 대비 200% 이상 시간이 걸렸지만 1.1 에서 최적화한 결과 zlib 보다 130~150% 정도로 그 격차가 많이 줄어들었습니다.

설명

Xinflate 는 Deflate 알고리즘의 압축해제 라이브러리입니다. Deflate 알고리즘은 zip 파일포맷에서 사용하는 압축 알고리즘이며, 빠른 속도와 좋은 압축률, 표준이 공개되어 있고, 특허 문제가 없다는 이유등으로 인해서 압축 알고리즘의 표준으로 인정받고 있습니다.

gzip 포맷은 유닉스 계열에서 많이 쓰이는 압축 포맷인데, 이 포맷도 역시 deflate 알고리즘을 이용해서 파일을 압축하고 있으며, 이미지 포맷인 PNG 포맷도 역시 마찬가지로 deflate 알고리즘을 사용하고 있습니다.

여기서 공개한 소스는 샘플소스로 gzip 파일의 압축해제 기능을 가진 xgunzip 이라는 프로그램을 제공하고 있으므로 gzip 으로 압축한 파일의 압축 해제를 테스트해볼 수 있습니다.

이런건 왜 만들었나?

압축 알고리즘에 대한 공부는 매우 재미있는 일입니다. 이미 공개된 소스를 이용해서 압축시대라는 압축 프로그램을 만들어서 공개하고 있었지만, 그 바닥에 깔린 압축 알고리즘은 전혀 모르고 있었습니다. 그래서 Huffman, LZ77 등의 알고리즘을 공부하면서 샘플 소스를 짜보기 시작했고, 압축 알고리즘의 표준이라고 할 수 있는 Deflate 알고리즘을 구현해 보고자 하였으며, 몇일간의 삽질끝에 Xinflate 라는 놈을 만들어 냈습니다.

Deflate 알고리즘은 여러 분야에서 사용되고 있기 때문에 XInflate 는 여러모로 쓸모가 많습니다. 현재 개발을 중비중인 모종의 프로젝트에 XInflate 를 사용할 생각으로 만들었기 때문에 나름 공을들여서 코딩을 했습니다.

만일 Deflate 알고리즘을 공부하고자 하는 사람이 있다면 이 소스는 꽤 도움이 될것이며, 만일 현업에서 gzip 파일등을 처리하고자 할 경우에도 도움이 될껍니다.

장점

ZLIB 보다 사용법이 간단합니다. 파일이 단 두개로 구성되어 있으므로 프로젝트에 간단히 추가가 가능하고, c++ 로 만들어져 있기 때문에 사용방법도 쉽습니다. 아래는 XInflate클래스의 public 메소드입니다. 딱 봐도 참 쉬워 보이지 않나요?

    void                  Init();
    void                  Free();
    XINFLATE_ERR          Inflate(const BYTE* inBuffer, int inBufferLen);
    int                   GetOutBufferLen() const;
    const BYTE*           GetOutBuffer() const;

특히 소스는 가독성이 높고 주석이 잘 달려있기 때문에 학습용 자료로도 매우 유용할것이라고 믿습니다.

참고

이 라이브러리는 꿀뷰3의 스킨파일(zip으로 묶여 있음) 처리에 사용중입니다.

TODO

속도 최적화를 통해서 zlib 에 근접하는 속도를 내도록 개량할 예정입니다.

이 소스를 이용해서 unzip, png 디코더 등을 개발할 예정입니다. -> 개발 완료

아마도 Deflate 압축 알고리즘의 구현은 먼 훗날의 이야기일듯.