ZLib 을 이용해서 메모리의 데이터 버퍼를 압축하고 압축한 메모리 데이터를 파일로 저장한다.
ZLib 은 메모리속 버퍼에서 버퍼로 압축하는 두개의 다른 함수를 제공
zlib.h 아래 함수 가 존재함.
dest - 압축된 데이터가 저장될 대상 버퍼의 포인터
destLen - 함수가 리턴된 후 이 값은 대상 버퍼의 사이즈가 리턴될것이다.
source - 압축할 원본 버퍼의 포인터
sourceLen - 원본소스의 크기
한쪽엔 소스 데이터의 포인터를 , 한쪽엔 압축데이터를 위한 빈 포인터 사용
압축 설정을 좀더 변경 하고 싶다면 아래 함수 사용.
파라미터는 compress 하나만 빼고 함수와 동일하나 level 값은 데이터 압축 레벨(성능)
Z_NO_COMPRESSION - 압축 안함
Z_BEST_SPEED - 빠른 압축 시간을 위한 경우
Z_BEST_COMPRESSION - 최고의 압축률을 원할 경우
Z_DEFAULT_COMPRESSION - 압축시간과 압축률사이의 중간값
이 두개의 함수는 성공하면 Z_OK 를 리턴한다. 실패시엔 좀더 자세한 정보가 들어있는 에러코드가 리턴된다.
int ZEXPORT compress(Bytef* dest,
uLongf *destLen,
const Bytef *source,
uLong SourceLen);
int ZEXPORT compress2(Bytef *dest,
uLongf *destLen,
const Bytef *source,
uLong SourceLen,
int level);
전체 소스
int main() {
FILE *FileIn = fopen("FileIn.bmp", "rb");
FILE *FileOut = fopen("FileOut.dat", "wb");
//입력 파일의 사이즈를 구한다.
fseek(FileIn, 0, SEEK_END);
unsigned long FileInSize = ftell(FileIn);
// raw 데이터와 압축 데이터의 버퍼를 생성한다.
void *RawDataBuff = malloc(FileInSize);
void *CompDataBuff = NULL;
// zlib 에서는zlib 데이터스트림의 오버헤드를 막기위해 압축 버퍼 사이즈는 최소 원본 버퍼 + 12 바이트보다 0.1 배는 커야한다고 밝힌다.
// ( 밑에 밑줄은 source -> dest 가 오타가 아닌지 의심)
//원본 : zlib states that the source buffer must be at least 0.1times larger than the source buffer plus 12 bytes to cope with the overhead of zlib data streams
uLongf CompBuffSize = (uLongf)(FileInSize + (FileInSize * 0.1) + 12);
CompDataBuff = malloc((size_t)(CompBuffSize));
//파일의 데이터를 소스 버퍼로 읽어들인다.
fseek(FileIn, 0, SEEK_SET);
fread(RawDataBuff, FileInSize, 1, FileIn);
//데이터를 압축한다.
uLongf DestBuffSize;
compress2((Bytef*)CompDataBuff, (uLongf*)&DestBuffSize, (const Bytef*)RawDataBuff, (uLongf)FileInSize, Z_BEST_COMPRESSION);
// 압축된 데이터를 디스크에 기록
fwrite(CompDataBuff, DestBuffSize, 1, FileOut);
return 0;
}
출처: https://overface.tistory.com/30?category=452410 [임이지의 블로그]
ZLIB 사용하여 메모리에 압축 풀기 (0) | 2021.01.06 |
---|---|
Lempel-Ziv 알고리즘 (0) | 2018.09.04 |
GZIP 구조 (0) | 2017.10.14 |
Run Length Encoding(1) (0) | 2017.10.14 |
PKZIP 구조(2) (0) | 2016.01.19 |
댓글 영역