2013-07-26 83 views
0

我有一個gzip文件示例,帶有標準gzip頭文件1F 8B 08 00 ...,當我用zlib中的inflate*函數給它充氣時,輸出只有11個字節輸出應爲約4KB),但是當我gz*功能解壓縮它,它產生正確的輸出,代碼:使用gz*使用gz *函數解壓成功但是使用zlib失敗*函數使用zlib

  1. (這可產生正確的輸出):

    #define CHUNK 10240 
    int gz_decompress(const char *path) { 
        gzFile f = gzopen(path, "rb"); 
        if(!f) 
         return -1; 
    
        unsigned char result[CHUNK]; 
        int bytes_read = gzread(f, result, CHUNK); 
        if(bytes_read < CHUNK) 
         if(!gzeof(f)) 
          return -2; 
        gzclose (f); 
        return 0; 
    } 
    
  2. 使用inflate*(輸出是隻有11字節):

    #define CHUNK 10240 
    int inf(FILE *source) 
    { 
        int ret; 
        unsigned have; 
        z_stream strm; 
        unsigned char in[CHUNK]; 
        unsigned char out[CHUNK]; 
    
        /* allocate inflate state */ 
        strm.zalloc = Z_NULL; 
        strm.zfree = Z_NULL; 
        strm.opaque = Z_NULL; 
        strm.avail_in = 0; 
        strm.next_in = Z_NULL; 
        // ret = inflateInit(&strm); 
        ret = inflateInit2(&strm, 16 + 15); 
        if (ret != Z_OK) 
         return ret; 
    
        /* decompress until deflate stream ends or end of file */ 
        do { 
         strm.avail_in = fread(in, 1, CHUNK, source); 
         if (strm.avail_in == 0) 
          break; 
         strm.next_in = in; 
    
         /* run inflate() on input until output buffer not full */ 
         do { 
          strm.avail_out = CHUNK; 
          strm.next_out = out; 
          ret = inflate(&strm, Z_NO_FLUSH); 
          assert(ret != Z_STREAM_ERROR); /* state not clobbered */ 
          switch (ret) { 
          case Z_NEED_DICT: 
           ret = Z_DATA_ERROR;  /* and fall through */ 
          case Z_DATA_ERROR: 
          case Z_MEM_ERROR: 
           (void)inflateEnd(&strm); 
           return ret; 
          } 
          have = CHUNK - strm.avail_out; 
         } while (strm.avail_out == 0); 
    
         /* done when inflate() says it's done */ 
        } while (ret != Z_STREAM_END); 
    
        /* clean up and return */ 
        (void)inflateEnd(&strm); 
        return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; 
    } 
    

事實上,第二片段來自官方zlib的使用例zpipe.c,我根據this zlib gzip discussion改變僅inflateInit(&strm);調用到inflateInit2(&strm, 16 + 15);,但現在我不知道爲什麼它失敗了,任何人都可以幫忙?

回答

0

根據您的意見,inf()返回Z_OK,這意味着gzip流正在成功解壓縮和驗證。

你是什麼意思「輸出只有11個字節」?你的inf()函數完全不能產生輸出。

+0

由於過去兩天都是週末,所以我打開'binary'選項打開文件,'inf()'返回值爲0的'Z_OK',我在這個函數中調試過了,在那裏沒有任何錯誤。 –

+0

是的,我同意你的看法,它不應該輸出任何內容,但實際上它產生了11個字節的輸出,每個字節都是0.我在這裏粘貼了示例文件:http://www.filehostfree.com/?d= 51F605CA1,真的很感激,如果你可以對它進行測試。 –

+0

我沒有時間調試您的代碼。你可以計算'inf()'中產生的字節和/或寫出它們來檢查解壓是否正確發生。你的11個字節完全來自其他地方,因爲你的'inf()'不會產生輸出。 –