ZLib gZip压缩会产生损坏的结果

时间:2015-08-30 19:33:29

标签: c++ zlib

我正在尝试使用以下代码从xml生成gzip压缩文件:

stream.next_in = inbuf; 
   stream.avail_in = 0; 
   stream.next_out = outbuf; 
   stream.avail_out = myBufferSize; 

   int infile_remaining = inFileSize; 

   if (deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, windowsBits  + 16, 9, Z_DEFAULT_STRATEGY) != Z_OK)
   {
      return 0;
    }

   for ( ; ; ) 
   { 
      int status; 
      if (!stream.avail_in) 
      { 
         int n = min(BUFFER_SIZE, infile_remaining); 
         if (MyFileReadFunc(pInfile, inbuf, n) != n) 
         { 
            deflateEnd(&stream);
            return -1;
         } 

         stream.next_in = inbuf; 
         stream.avail_in = n; 
         infile_remaining -= n; 
      } 

      status = deflate(&stream, infile_remaining ? Z_NO_FLUSH : Z_FINISH);
      if ((status == Z_STREAM_END) || (!stream.avail_out)) 
      { 
         int w = myBufferSize - stream.avail_out; 
         if (MyFileWriteFunc(pOutfile, outbuf, w) != w) 
         { 
            deflateEnd(&stream);
            return -1;
         } 

         stream.next_out = outbuf; 
         stream.avail_out = myBufferSize;
      }

      if (status == Z_STREAM_END) 
         break; 
      else if (status != Z_OK) 
      { 
         deflateEnd(&stream);
         return 0;
      } 
   }

   if (deflateEnd(&stream) != Z_OK) 
   { 
      return 0; 
   } 

我测试的输入xml文件是2 KB,结果似乎总是被破坏。 注意:当我从文件中删除一些数据时,它似乎正常工作(然后我在不同的输入文件上测试它并得到相同的结果)。

1 个答案:

答案 0 :(得分:0)

首先,int readedint written未使用,nw未设置。也许你的意思是int nint w

其次,else if (status != Z_OK)过于严格。你也可以得到一个Z_BUF_ERROR,你应该继续,而不是错误。 Z_BUF_ERROR并非真正的错误,只是警告说最后一次通话没有取得任何进展。您可以从那里继续,提供更多输入和/或更多输出空间。

其他要点:您可能不想对每个缓冲区使用Z_SYNC_FLUSH。除非您有理由插入同步标记,否则会不必要地降低压缩率。只需使用Z_NO_FLUSH即可。另外,memLevel的9可以减少压缩。您应该试验一下您的数据。通常8(默认值)效果更好。