compress,uncompress 함수 사용하기


zlib 라이브러리는 다양한 형태의 압축 데이터를 생성할 수 있습니다. 대용량 데이터를 압축할 때는 do.. while 구문으로 반복적으로 압축하고 Z_NO_FLUSH 모드로 압축한 후 마지막에 Z_FINISH 모드로 압축합니다. 적은 메모리를 사용하는 데이터를 압축하는 경우, 즉 입력 버퍼가 몇 메가 안쪽이라고 100% 확신하거나, 충분히 예상 가능한 범위 내 버퍼를 사용한다면, 입력 버퍼와 출력 버퍼를 고정으로한 압축 함수를 사용할 수도 있습니다.

compress 함수는 입력 버퍼가 작은 경우, 한번에 압축 완료합니다. 즉 Z_FINISH 모드를 사용해서 압축합니다. 출력 버퍼는 입력 버퍼의 2배 + 13 바이트를 넘지 않습니다. compress 함수에 충분한 출력 버퍼를 제공하면 문제없이 압축이 되어집니다.

uncompress 함수는 compress 함수로 압축된 버퍼를 해제합니다. 고정 버퍼 Dictionary를 사용한 경우에는 해제되지 않습니다. 또한 Z_FINISH로 종료 시그널이 없는 데이터도 해제되지 않습니다. 결국 compress 함수로 압축된 데이터를 해제합니다. uncompress 함수로 해제된 데이터의 길이를 계산하는 함수는 없습니다. 결국 압축하는 프로그램과 압축 해제하는 프로그램은 최대 입력 버퍼의 길이, 최대 출력 버퍼의 길이를 미리 약속하고, 프로그래밍해야 합니다. 그렇지 않는 경우는 해당 함수를 사용하지 말고, zlib 기본 함수를 사용해서 프로그래밍해야 합니다.

// Simple6_simpcom.cpp : Defines the entry point for the console application.
//

#include  "stdafx.h"

#include  <LibZ/zlib.h>
#include  <string>
#include  <iostream>

int  _tmain(int  argc, _TCHAR* argv[])
{
   const  int BUF = 1024;
   const  int DBUF = BUF*2 +13;

   Bytef raw_data[] ="안녕하세요.";
   Bytef deflate_data[DBUF];

   uLong raw_size = strlen( (const  char*) raw_data);
   uLong deflate_size = DBUF;

   //compress 사용하기
   {
       compress(deflate_data,&deflate_size,raw_data, raw_size);
       std::cout<<"Raw Data Size:"<< raw_size<<std::endl;
       std::cout<<"Deflate Data Size:"<<deflate_size<<std::endl;
   }

   Bytef inflate_data[BUF];
   uLong inflate_size = BUF;
   //uncompress 사용하기
   {
       uncompress(inflate_data,&inflate_size,deflate_data, deflate_size);
       std::cout<<"Deflate Data Size:"<<deflate_size<<std::endl;
       std::cout<<"Inflate Size:"<< inflate_size<<std::endl;
       inflate_data[inflate_size]=NULL;
       std::cout<< "원본  데이터:"<< ( const  char*)inflate_data<<std::endl;
   }

    system("pause");

   return 0;
}

- 목록:

13 thoughts on “gz 파일 사용하기

  1. 안녕하세요 좋은 영상과 글을 잘 봤습니다.
    글에 보면 “입력 버퍼와 출력 버퍼를 고정으로한 압축 함수”에 대해서 어떤 함수를 봐야 하는지 알수 있을까요?
    좋은 글 감사드리며, 오래된 글에 문의를 남깁니다.
    감사합니다.

  2. 동영상 잘 보았습니다. 궁금한것이 있는데요, Z_SYNC_FLUSH 를 사용할 경우에, 만약 next_out buffer 크기가 압축한 data 를 담기에 충분하지 않는다면, 어떻게 해야 하는지요?

    • Z_SYNC_FLUSH는 쓰고 있는 비트를 모두 바이트 단위로 쓰라는 옵션임으로 일반적인 쓰기 과정에서 발생한 에러 코드를 반환하게 되어 있습니다. [Deflate 샘플] 동영상을 참고하세요.

  3. C로 압축하고 c#으로 압축을 푸는 방법이 있을까요?
    텍스트 파일을 작성시

    gzwritre(파일 포인터, 2019, sizeof(int));
    gzwritre(파일 포인터, 09, sizeof(int));
    gzwritre(파일 포인터, 17, sizeof(int));

    gzwritre(파일 포인터, 0.1, sizeof(float)); 결과값
    gzwritre(파일 포인터, 0.2, sizeof(float));
    gzwritre(파일 포인터, 0.3, sizeof(float));

    gzwritre(파일 포인터, 100.0, sizeof(float));

    이렇게 텍스트 파일을 저장(압축)했는데 C#에서 이 파일을 읽어서

    연 / 월 / 일 을 정수 변수에
    결과값을 실수배열에 저장하고 싶습니다.

  4. 분할 압축파일일 경우 zilb로 압축 해제가 가능 한가요?
    아니면 다른 라이브러리를 사용해야 할까요 ?

    • 별도로 지원하는 함수는 없지만 그냥 저장하는 과정에서 파일만 나눠 저장하는 것이 아닐지요.

  5. 안녕하세요
    c++에서 zlib uncompress로 .emf image 파일을 압축해제 하려고 합니다.
    그런데 손상된 파일이을 대상으로 진행할 경우 Z_DATA_ERROR을 반환하면서 자동종료됩니다.
    압축된 파일이 Z_DATA_ERROR를 반환하면(손상된 파일이면) 빈 .emf image 파일로 압축해제 되도록 하려면 어떻게 해야할까요?

  6. 리눅스에서 C언어를 사용해서 zlib으로 위와 같이 폴더(디렉토리)를 압축할수있나요?

Leave a Reply to DENIS DOS SANTOS SILVA Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>