使用 Zlib 将数据压缩成块
Compress data to chunks using Zlib
我想用 zlib 压缩一个大于 50mb 的文件。
但我希望压缩文件是块状的(例如,32Kb 块)。
我不想读取 32Kb 的未压缩文件并压缩它。
压缩文件应包含 32kb 的压缩块。
应在 avail_out = 32kb
.
后重置压缩
我只需要用 zlib 来做,这是为了随机访问。
这是我目前拥有的:
do {
strm.avail_in = fread(in, 1, CHUNK, source);
flush = feof(source) ? Z_FINISH : Z_FULL_FLUSH;
strm.next_in = in;
strm.next_out = out;
strm.avail_out = CHUNK;
deflate(&strm, flush);
if (strm.avail_out == 0)
have = tmp;
else
have = CHUNK - strm.avail_out;
fwrite(out, 1, have, dest);
tmp = strm.avail_out;
if (tmp == 0)
deflateReset(&strm);
} while (flush != Z_FINISH);
但是这段代码有几个问题。
当我每 32Kb 重置压缩时,我丢失了一些尚未写入的压缩字节,因为 avail_out
已满;如果我尝试编写它们,那么压缩块将不再是 32Kb。
如果我知道在 avail_out
填满时压缩了多少数据,我可以重置文件位置并从那里开始压缩。
无法保证您可以准确填充所需的尺寸,但可以非常接近。请参阅 fitblk.c
了解如何操作。
我想用 zlib 压缩一个大于 50mb 的文件。 但我希望压缩文件是块状的(例如,32Kb 块)。
我不想读取 32Kb 的未压缩文件并压缩它。
压缩文件应包含 32kb 的压缩块。
应在 avail_out = 32kb
.
我只需要用 zlib 来做,这是为了随机访问。
这是我目前拥有的:
do {
strm.avail_in = fread(in, 1, CHUNK, source);
flush = feof(source) ? Z_FINISH : Z_FULL_FLUSH;
strm.next_in = in;
strm.next_out = out;
strm.avail_out = CHUNK;
deflate(&strm, flush);
if (strm.avail_out == 0)
have = tmp;
else
have = CHUNK - strm.avail_out;
fwrite(out, 1, have, dest);
tmp = strm.avail_out;
if (tmp == 0)
deflateReset(&strm);
} while (flush != Z_FINISH);
但是这段代码有几个问题。
当我每 32Kb 重置压缩时,我丢失了一些尚未写入的压缩字节,因为
avail_out
已满;如果我尝试编写它们,那么压缩块将不再是 32Kb。如果我知道在
avail_out
填满时压缩了多少数据,我可以重置文件位置并从那里开始压缩。
无法保证您可以准确填充所需的尺寸,但可以非常接近。请参阅 fitblk.c
了解如何操作。