상세 컨텐츠

본문 제목

ZLIB 사용하여 메모리에 압축 풀기

멀티미디어/압축(Compress)

by cepiloth 2021. 1. 6. 11:16

본문

728x90
반응형

 

/*
@parm : dest - 압축 해제된 데이터가 기록될 버퍼 포인터
@parm :  destLen -  압축 해제된 데이터의 사이트가 리턴된다.
@parm :  source -  압축 해제될 원본 버퍼의 포인터
@parm :  sourceLen - 압축된 버퍼의 byte 크기.
압축 함수와는 달리 , 해제에는 커스텀 설정이 그리 존재하지 않기 때문에 하나의 함수만 존재
uncompress 함수는 성공과 실패의 리턴값이 compression 과 같다.
*/
int uncompress(Bytef *dest, 
                    uLongf *destLen, 
                    const Bytef *source, 
                    uLongf sourceLen);
 
int main() {
    FILE *FileIn = fopen("FileOut.dat", "rb");
     
    //출력 파일
    FILE *FileOut = fopen("OrigFile.bmp", "wb");
     
    // 입력파일의 사이즈를 구한다.
    fseek(FileIn, 0, SEEK_END);
    unsigned long FileInSize = ftell(FileIn);
     
    //raw 데이터와 압축해제될 데이터의 버퍼 생성
    void *RawDataBuff = malloc(FileInSize);
    void *UnCompDataBuff = NULL;
     
    //원본 버퍼로부터 파일 데이터를 읽는다.
    fseek(FileIn, 0, SEEK_SET);
    fread(RawDataBuff, FileInSize, 1, FileIn);
     
    // 압축을 풀수 있을 정도의 버퍼 크기를 할당한다. 우린 원본의 크기를 알기땜에 걍 잡았다.
    uLongf UnCompSize = 482000;
    UnCompDataBuff = malloc(UnCompSize);
     
    // 필요한 작업은 준비됐으니 소스 버퍼로부터 압축을 한다(uncompress가 아닐까?). 해제된 사이즈는 UnCompSize 에 기록될 것이다. (이부분도 좀 이상)
    //all data we require is ready so compress it into the source buffer, the exact size will be stored in UnCompSize
    uncompress((Bytef*)UnCompDataBuff, &UnCompSize, (const Bytef*)RawDataBuff, FileInSize);
     
    //해제된 데이터를 디스크에 기록한다.
    fwrite(UnCompDataBuff, UnCompSize, 1, FileOut);
        
    return 0;
}
728x90
반응형

'멀티미디어 > 압축(Compress)' 카테고리의 다른 글

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

관련글 더보기

댓글 영역