如何承担这将是zlib的解压缩后的大小?

问题描述 投票:0回答:2

我想提出的是有压缩的数据发送到我的API一个简单的C ++应用程序。该API触发那个也压缩的应用程序的响应。我要解压缩。我使用的zlib的解压缩功能,但我不知道数据有多大。有些人可以帮我解决这个问题?如何计算并设定目标缓冲区的大小?

c++ compression zlib
2个回答
1
投票

我觉得文档关于这个真正明确

ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
                               const Bytef *source, uLong sourceLen));

解压缩源缓冲区到目标缓冲区。 sourceLen是源缓冲区的字节长度。在入口处,destLen是目标缓冲区,其必须足够大以容纳整个未压缩数据的总大小。退出时(未压缩数据的大小必须先前已经由压缩机保存,并通过该压缩库的范围之外的一些机构传递到解压缩器。),destLen是未压缩数据的实际大小。

解压缩返回Z_OK如果成功,如果Z_MEM_ERROR没有足够的存储器,Z_BUF_ERROR如果有没有足够的空间在输出缓冲器中,或Z_DATA_ERROR如果输入数据被破坏或者不完整的。在存在没有足够的空间的情况下,解压缩()将填充非压缩数据的输出缓冲区到这一点。

所以zlib的建议与压缩流一起发送在未压缩的大小。

但是,我们还可以注意到句子

在存在没有足够的空间的情况下,解压缩()将填充非压缩数据的输出缓冲区到这一点。

所以,你可以包括在开始压缩消息的长度。然后在您的目的地开始与小缓冲区解压。它可能不是解压缩一切都变成了小缓冲区。但它会解压足够你来读取数据长度,如果你在开始写的。然后,你可以用它来分配/调整你的目标缓冲区,并再次使用解压缩。

根据您的使用情况,这可能是一个好主意或没有。如果你的邮件大小差别不大,并且程序不再运行它可能只是最好只维持一个目标缓冲区,只是增加了一个按需之一。


0
投票

作为速度优化,如果你愿意做重复的调用来解压缩偶尔可以预测你的DEST缓冲区的大小为下一个电话。通常的情况是在一个给定的流数据段压缩由相同的因子,大致的情况。例如,文本将通过2压缩到3倍典型。因此,地方记录您的DEST缓冲区的大小最后。然后,分配下一个解压调用相同的金额。如果太少(Z_BUF_ERROR),则增加缓冲区大小和重复。如果过多的缓冲空间,是没有问题的;只是减少下一次呼叫的大小。

下面是一个额外的优化。假设您的目标将是非常大的,比如说千兆字节大。而你不想浪费CPU周期做试验decompressions。您可以养活你的源数据的只有第一个几百KB,看看它有多少扩展。然后相应地分配的实际DEST缓冲器。我不知道,如果解压缩()将让你这样做虽然但膨胀()会。

© www.soinside.com 2019 - 2024. All rights reserved.