HOME > 기초 지식

 

기초 지식

 

 

목차

1.      반드시 알아야 할 사항 – related to all functions

A.      압축률

B.      Strategy Parameter

C.      Error Code

2.      추가적으로 알아둬야 할 사항 – related to the basic and advanced functions.

A.      Window Bits

B.      구조체 Z_STREAM

C.      Constants



반드시 알아야 할 사항.

1.     압축률
압축률은 다음과 같이 정의되어 있다.


/* compression levels */
#define Z_NO_COMPRESSION                    0
#define Z_BEST_SPEED                             1
#define Z_BEST_COMPRESSION                 9
#define Z_DEFAULT_COMPRESSION           (-1)


기본적으로 압축률은 0에서 9 사이의 값을 갖는다.

0인 경우에는 단순히 Input data를 복사할 뿐이다.
Z_DEFAULT_COMPRESSION은 Level 6와 같다.

숫자가 클수록 압축률이 높지만, 그에 따라 더 많은 시간이 필요하다.



2.     Strategy Parameter
압축 알고리즘을 조정할 수 있다.
기본적으로 Zlib의 deflate 압축 알고리즘은 Lempel-Ziv (LZ77) 알고리즘과 Huffman encoding 알고리즘을 순서대로 적용한다.


#define Z_FILTERED                        1
#define Z_HUFFMAN_ONLY             2

#define Z_DEFAULT_STRATEGY       0


A.      Z_DEFAULT_STRATEGY
normal data, 즉 LZ77과 Huffman encoding 알고리즘을 순서대로 적용한다.

B.      Z_HUFFMAN_ONLY
Huffman encoding만을 사용한다. 문자열 매치(LZ77)는 이뤄지지 않는다.

C.      Z_FILTERED
Z_DEFAULT_STRATEGY와 Z_HUFFMAN_ONLY의 중간형이라고 할 수 있다.                
문자열 매치(LZ77)의 비중은 줄고, Huffman coding의 비중은 더 늘어난다.                      
랜덤한 분포를 가지고 있는 작은 값으로 이뤄진 데이터의 경우 문자열 매치보다 Huffman coding의 비중이 클수록 좋은 효과를 볼 수 있다.



3.   Error Code
대부분의 Zlib library함수는 다음과 같은 에러 코드를 반환한다.


/* Return codes for the compression/decompression functions. Negative
* values are errors, positive values are used for special but normal events.
*/

#define Z_OK                       0
#define Z_STREAM_END       1
#define Z_NEED_DICT           2
#define Z_ERRNO                 (-1)
#define Z_STREAM_ERROR   (-2)
#define Z_DATA_ERROR       (-3)
#define Z_MEM_ERROR        (-4)
#define Z_BUF_ERROR         (-5)
#define Z_VERSION_ERROR (-6)


Z_OK if success
Z_DATA_ERROR if the input data is corrupted

Z_MEM_ERROR if there was not enough memory
Z_BUF_ERROR if there was not enough room in the output buffer

 

 

추가적으로 알아둬야 할 사항Utility Function만을 사용할 경우에는 알 필요 없다.

 

 

1. Window Bits

 

Zlib에서 Window Bits값은 다음과 같이 정의되어 있다.

 

 

/*

The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage.

*/

 

#ifndef MAX_WBITS
#  define MAX_WBITS   15 /* 32K LZ77 window */
#endif



Zlib library를 사용하여 GZIP 파일로 압축 및 복원하기 위해서, deflate함수와 inflate함수를 호출한다.
함수 호출 전에 이를 위한 초기화 과정이 필요한데, 각각 deflateInit(또는 deflateInit2)와 inflateInit(또는inflateInit2)함수를 호출한다.
GZIP으로 압축 및 복원하기 위해서는 Window Bit값을 설정할 수 있는 deflateInit2와 inflateInit2 함수를 호출해야 한다.
이 때 Window Bit값을 –(MAX_WBITS)로 설정하기 바란다.

참고로 ‘-’ 붙는 이유는 이렇다.
GZIP 은 Zlib와 밀접한 연관을 갖고 있으며, 실제로 파일 포맷이 거의 같다.
하지만 헤더에서 약간의 차이를 보인다.
그리고 Zlib에서 제공하는 압축 함수는 기본적으로 Zlib 파일 포맷으로 압축한다.
Window Bit값에 ‘-’를 붙이면, Zlib 파일 포맷이 아니라는 뜻이다.
또한 GZIP에서는 MAX_WBITS으로 압축 및 복원해야 한다.


즉, -MAX_WBITS값은 ‘GZIP파일 포맷’으로 압축 및 복원하라는 뜻이다.

 

 

 

2. 구조체 Z_STREAM

 

 

Basic Function 및 Advanced Function을 사용하여 압축하고자 할 때 볼 수 있다.

 

 

A. 구조.

 

typedef struct z_stream_s {
    Bytef    *next_in;  /* next input byte */
    uInt     avail_in;  /* number of bytes available at next_in */
    uLong    total_in;  /* total nb of input bytes read so far */
 
    Bytef    *next_out; /* next output byte should be put there */
    uInt     avail_out; /* remaining free space at next_out */
    uLong    total_out; /* total nb of bytes output so far */
 
    char     *msg;      /* last error message, NULL if no error */
    struct internal_state FAR *state; /* not visible by applications */
 
    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */
 
    int     data_type;  /* best guess about the data type: ascii or binary */
    uLong   adler;      /* adler32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream ;
 
typedef z_stream FAR * z_streamp;  ÿ 
 

 

 

 

B. Simple Example – 소스 코드 보기

 

 

 

z_stream stream;

//압축 결과를 저장할 버퍼 크기 지정

stream.avail_out=_resultsize;

//압축 결과를 저장할 버퍼 지정

stream.next_out=(Bytef*)_result;

//입력 버퍼 중의 데이터의 비트 수

stream.avail_in=0;

 

/* 모든 메모리 메니지먼트를 라이브러리에 맡긴다 */

stream.zalloc=Z_NULL;

stream.zfree=Z_NULL;

stream.opaque=Z_NULL;

 

//압축을 위한 초기화 과정

//-MAX_WBITS값은 GZIP에서 사용한다.

int err=deflateInit2(stream, compress Level, Z_DEFLATED,-MAX_WBITS,

          DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);

 

//읽은 원본 데이터

stream.next_in = (Bytef*)source;

//원본 데이터의 크기

stream.avail_in = (uInit)sourceLen;

 

//압축

while(stream.avail_in)

{

           err=deflate(&stream,_flush);

           if(err!=Z_OK)

                       break;

}

 

 

 

 

C. 설명

 

 

The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application.

The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value.

zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe.

On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see z conf .h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see z conf .h).

The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step).

 

 

 

 

 

3.  Constants

 

 

/* Possible values of the data_type field */
#define Z_BINARY   0
#define Z_ASCII    1
#define Z_UNKNOWN  2

 

/* The deflate compression method (the only one supported in this version) */
#define Z_DEFLATED   8

 

/* for initializing zalloc, zfree, opaque */

#define Z_NULL  0

 

/* for compatibility with versions less than 1.0.2 */
#define zlib_version zlibVersion()

 

 

/* will be removed, use Z_SYNC_FLUSH instead */
#define Z_NO_FLUSH      0
#define Z_PARTIAL_FLUSH 1 
 
/* Allowed flush values ; see deflate() below for details */
#define Z_SYNC_FLUSH    2
#define Z_FULL_FLUSH    3
#define Z_FINISH        4