2012-06-21 5 views
1

현재 C를 배우고 있으며 zlib를 사용하는 작은 프로그램을 만들려고 할 때 몇 가지 문제가 있습니다.C에서 zlib 사용

필자는 (Codeblocks/MinGW를 사용하여) zlib 라이브러리로 내 응용 프로그램을 컴파일 할 수 있었고 컴파일이 정상적으로 작동합니다. 공식 zlib 사이트 (zlib.net)에있는 예제 zpipe.c을 기반으로 예제를 사용했습니다.

실행시 출력 zip 파일이 생성되었지만 형식이 잘못되거나 비어있는 것처럼 보입니다. 7zip을 사용하여 열 수 없습니다.

다음은 내가 수정 한 코드입니다. zpipe.c 내의 main() 함수를 간단하게 대체했습니다.

int main() { 
    printf("Compression test..."); 

    int ret; 
    FILE *fpsource; 
    FILE *fpdest; 

    fpsource = fopen("test.txt", "rb"); 
    fpdest = fopen("output.zip", "wb"); 

    ret = def(fpsource, fpdest, Z_DEFAULT_COMPRESSION); 
    if (ret != Z_OK) { 
     printf("failure\n"); 
     zerr(ret); 
    } 
    else { 
     printf("success..\n"); 
    } 

    fclose(fpsource); 
    fclose(fpdest); 

    return EXIT_SUCCESS; 
} 

오류 메시지가 나타나고 'success'메시지가 인쇄됩니다. 출력 파일이 손상되었습니다.

+0

파일을 열 때 7zip이 무엇을 말합니까? – CharlesB

+0

@ H2CO3, POSIX에서'EXIT_SUCCESS'는'0' AFAIK로 정의되었지만 다른 값이 될 수도 있습니다 ... – Nim

+0

@CharlesB 그냥 일반적인 "파일 'output.zip'을 아카이브로 열 수 없습니다." –

답변

3

zpipe.c는 zlib 형식을 생성합니다. zlib 형식은 zlib 헤더 및 트레일러에 래핑 된 원시 압축 데이터입니다. 7zip은 그것을 인식하지 못합니다. 동일한 원시 수축 데이터에 완전히 다른 래퍼 인 gzip 또는 zip 형식을 인식합니다.

"2"가없는 버전 대신 deflateInit2 (및 inflateInit2)를 사용하여 zlib 형식 대신 gzip 형식을 선택하도록 zpipe.c를 수정할 수 있습니다. 이 작업을 수행하는 방법은 zlib.h을 참조하십시오.

+0

zlib의 저자 중 한 사람의 답변! – ydroneaud

4

설명 된 코드는 DEFLATE 알고리즘을 사용하여 파일을 간단하게 압축합니다. zip 또는 gzip 파일로 만드는 적절한 구조가 없습니다.