HOME > 기초 지식
기초 지식
목차
1. 반드시 알아야 할 사항 – related to all functions
A. 압축률
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만을 사용할 경우에는 알 필요 없다.
|
|||
|
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
|
||
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). |
|
|
|
||
|
|||
|
|
/* 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
|
|
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|