easyzlib 를 이용한 데이타 압축하기 코드 팁

보통 데이타를 압축하는 이유는 크기를 줄일려는 목적과 이로 인해 데이타의 전송 시간을 줄이는데 있죠.

그러니까 예를 들어 제가 원격 디버거 프로그램을 만들었다 치면, 전역/지역 변수의 목록이라던지, 레지스터 정보라던지

등등의 데이타를 TCP/IP 포트를 통해 송/수신을 해야 하는데요.

만약 이때 데이타의 사이즈가 너무크면 TCP/IP를 통해서 하는 디버깅이 느린 속도로 인하여 불편을 감수해야 합니다.

이때 데이타를 압축해서 보내면 속도의 이득을 볼수 있겠죠? ㅎㅎ

데이타 압축 방법에는 여러가지가 있지만 그중 허프만 코드 방식이 가장 대중화가 되어 있어요.

허프만 코드는 전체 구조에서 가장 많이 사용된 데이터를 가장 작은 비트 형태로 변환해서 저장하는 방식인데요.

우리가 가장 많이 사용하는 zip 압축 포맷이 허프만 코드 방식을 사용하는 대표적인 포맷이죠.


이번 포스팅의 핵심인 easyzlib은 zip 라이브러리를 이용하여 간단하게 압축할 수 있는 방법입니다.

easyzlib는 zip 라이브러리 (libz)의 사용법을 몰라도 쉽게 사용가능하도록 래핑이 되어 있어서 아주 손쉽게 사용이 가능합니다.

우선 easyzlib는 아래에서 다운로드 하세요.

easyzlib.zip

다음 easyzlib를 이용해서 데이타를 압축/해제하는 코드나갑니다.

#include "easyzlib.h"

void main(void)
{
char *source = "hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.aaaaaaaaaaaaa";
char *compressed;
long int compressedSize;
compressed = malloc(EZ_COMPRESSMAXDESTLENGTH(strlen(source)));

ezcompress( compressed, &compressedSize, source, strlen(source) );

printf("source %d bytes\n", strlen(source));
printf("compressed %d bytes\n", compressedSize);

char *uncompressed;
long int uncompressedSize;
uncompressed = malloc(999999);

ezuncompress( uncompressed, &uncompressedSize, compressed, compressedSize);
*(uncompressed+uncompressedSize) = '\0';

printf("uncompressed %d bytes\n", uncompressedSize);
printf("compressed \n%s\n", compressed);
printf("uncompressed \n%s", uncompressed);

free(compressed);
free(uncompressed);
}


결과는 다음과 같이 나올거구요. 무려 409바이트가 28바이트로 줄었네요. ㅎㅎ

$ ./test.exe
source 409 bytes
compressed 28 bytes
uncompressed 409 bytes
compressed
x쑰H苽▒W(▒/▒I麒e(;
uncompressed
hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.hello world.aaaaaaaaaaaaa

1