2015-02-02 2 views
0

확장 또는 제 3자를 사용하지 않고 zlib을 사용하여 zip 파일의 압축을 푸는 중입니다. 처음에는 src_len이 48756255이고 dest_len은 49209890입니다. while 루프의 첫 번째 패스는 오류가 있습니다. 오류가 Z_OK이고 두 번째 통과가 시작됩니다. 두 번째 단계에서, 내가 무엇을해도 Z_BUF_ERROR가 부풀려집니다. 이 시점에서 stream.total_out은 49034460이므로 남은 비트가 있지만 두 번째 패스의 stream.avail_in은 0입니다. 어쨌든 inflate가 Z_STREAM_END을 주길 기대합니다. 나는 정말로 무슨 일이 일어나고 있는지 모른다. 아무도 도와 줄 수 있니?zlib가 버퍼 오류를 반환합니다.

void compression::uncompress2(char* dest, unsigned dest_len, char* src, unsigned src_len) { 
    TempAllocator ta; 

    z_stream_s stream = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
    stream.next_in = (Bytef*)src; 
    stream.avail_in = (uInt)src_len; 
    stream.next_out = (Bytef*)dest; 
    stream.avail_out = (uInt)dest_len; 
    stream.zalloc = zalloc; 
    stream.zfree = zfree; 
    stream.opaque = &ta; 

    // no header 
    int err = inflateInit2(&stream, -MAX_WBITS); 
    XENSURE(err == Z_OK); 

    bool done = false; 
    while (!done) {  
     stream.next_out = (Bytef*)(dest + stream.total_out); 
     stream.avail_out = dest_len - stream.total_out; 

     err = inflate(&stream, Z_SYNC_FLUSH); 
     if (err == Z_STREAM_END) 
      done = true; 
     else if (err != Z_OK) { 
      break; 
     } 
    } 

    err = inflateEnd(&stream); 
    XENSURE(err == Z_OK); 
} 
+0

"TempAllocator"란 무엇입니까? 작동합니까? 내가하는 방식은 다음과 같습니다. http://pastebin.com/PdGWX4cc inflate2 대신 inflate2를 사용하지만 변경할 수는 있지만 여전히 잘 작동합니다. – Brandon

+0

게시 한 코드를 시도했지만 stream_end 대신 끝에 버퍼 오류가 표시됩니다. –

답변

5

inflate() 가능한 출력을 이용 가능한 입력을 처리한다. 입력을 처리하거나 출력을 생성 할 수 없으면 Z_BUF_ERROR을 반환합니다.

이 경우 모든 입력이 처리되고 여유 공간이 있지만 스트림의 끝은 감지되지 않습니다. 어떤 이유로 완전한 수축 흐름을 제공하지 않기 때문에 Z_STREAM_END을 얻지 못하고 있습니다.

다음은 코드에 대한 다른 의견입니다. 루프는 아무것도 수행하지 않으며 루프에서 next_outavail_out을 설정하면 아무 일도하지 않습니다. 루프에 새로운 입력이나 새로운 출력 공간을 제공하지 않으므로 루프를 수행 할 필요가 없습니다. inflate() 주위에 루프가있는 유일한 목적은 더 많은 입력을 제공하거나 더 많은 출력 공간을 제공하거나 두 가지 모두를 제공하는 것입니다. 또한 inflate()이 반환되면 next_outavail_out은 출력 버퍼에서 사용 가능한 다음 위치와 사용할 수있는 공간으로 업데이트됩니다. 루프에 next_outavail_out을 설정 한 진술은 이미 가지고있는 값으로 설정됩니다.

code with proper loops around inflate()에서 Z_BUF_ERROR은 문제가되지 않으며 처리를 계속할 수 있습니다. inflate()의 다음 호출에서 다른 결과가 나올 것으로 예상 되더라도 더 많은 입력 및/또는 더 많은 출력 공간이 제공되어야합니다.

stream을 0으로 초기화 할 필요는 없습니다. 후속 과제물 만 있으면됩니다.