我正在尝试使用以下代码从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,结果似乎总是被破坏。 注意:当我从文件中删除一些数据时,它似乎正常工作(然后我在不同的输入文件上测试它并得到相同的结果)。
答案 0 :(得分:0)
首先,int readed
和int written
未使用,n
和w
未设置。也许你的意思是int n
和int w
?
其次,else if (status != Z_OK)
过于严格。你也可以得到一个Z_BUF_ERROR
,你应该继续,而不是错误。 Z_BUF_ERROR
并非真正的错误,只是警告说最后一次通话没有取得任何进展。您可以从那里继续,提供更多输入和/或更多输出空间。
其他要点:您可能不想对每个缓冲区使用Z_SYNC_FLUSH
。除非您有理由插入同步标记,否则会不必要地降低压缩率。只需使用Z_NO_FLUSH
即可。另外,memLevel
的9可以减少压缩。您应该试验一下您的数据。通常8(默认值)效果更好。