2015-01-15 45 views
0

我想使用inflate()來解壓縮緩衝區並將結果寫入文件。 因此我使用了this example的代碼。我還使用示例代碼來減壓我的緩衝區,這沒有問題。但是當我膨脹我的數據時,輸出大小似乎是錯誤的。我的文件輸出具有適當誇大的代碼,但在寫入CHUNK字節(16kB)之前,末尾填充'0xCC'。輸入緩衝區的大小是< CHUNK。文件流設置爲O_BINARY。內部循環運行兩次,一次strm.avail_out == 0,然後strm.avail_out == CHUNK。這意味着CHUNK字節被寫入,儘管輸出的大小更小。zlib:inflate返回錯誤的avail_out?

#define CHUNK 16384 

byte chunkBuf[CHUNK]; 

int inf(byte *src, size_t srcsize, FILE *dest) 
{ 
    int ret; 
    unsigned have; 
    unsigned char in[CHUNK]; 
    unsigned long srcpos = 0; 
    z_stream strm; 

    /* 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); 
    if (ret != Z_OK) { 
     printf("ERR: inf: %i\n",ret); 
     return ret; 
    } 
    /* decompress until deflate stream ends or end of file */ 
    do { 
     if (srcsize - srcpos > CHUNK) { 
      memcpy(in,src+srcpos,CHUNK); 
      strm.avail_in = CHUNK; 
      srcpos += CHUNK; 
     } else if (srcsize - srcpos > 0) { 
      memcpy(in,src+srcpos,srcsize - srcpos); 
      strm.avail_in = srcsize - srcpos; 
      srcpos = srcsize; 
     } else { 
      break; 
     } 

     strm.next_in = in; 

     /* run inflate() on input until output buffer not full */ 
     do { 
      strm.avail_out = CHUNK; 
      strm.next_out = chunkBuf; 
      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; 
      if (fwrite(chunkBuf, 1, have, dest) != have || ferror(dest)) { 
       (void)inflateEnd(&strm); 
       return Z_ERRNO; 
      } 
     } 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; 
} 

回答

1

你可能給了錯誤的長度來壓縮和壓縮你的數據後的垃圾。

+1

胡,馬克阿德勒本人。 :D這就像你說的,我給def()的文件大小是一個字節太大。我甚至沒有考慮過減壓是因爲它的工作如此整齊。 :) 非常感謝你。 – Showdown