gpt4 book ai didi

c++ - 如何假设 zlib 解压缩后的大小是多少?

转载 作者:行者123 更新时间:2023-11-28 04:24:56 25 4
gpt4 key购买 nike

我正在制作一个简单的 C++ 应用程序,它必须将压缩数据发送到我的 API。API 在同样被压缩的应用程序中触发响应。我必须解压缩它。我正在使用 zlib 的解压缩功能,但我不知道数据有多大。有人可以帮我解决这个问题吗?如何计算和设置目标缓冲区的大小?

最佳答案

我认为 documentation对此非常清楚

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

Decompresses the source buffer into the destination buffer. sourceLenis the byte length of the source buffer. Upon entry, destLen is thetotal size of the destination buffer, which must be large enough tohold the entire uncompressed data. (The size of the uncompressed datamust have been saved previously by the compressor and transmitted tothe decompressor by some mechanism outside the scope of thiscompression library.) Upon exit, destLen is the actual size of theuncompressed data.

uncompress returns Z_OK if success, Z_MEM_ERROR if there was notenough memory, Z_BUF_ERROR if there was not enough room in the outputbuffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.In the case where there is not enough room, uncompress() will fill theoutput buffer with the uncompressed data up to that point.

因此 zlib 建议将未压缩的大小与压缩流一起发送。

但是我们也可以记下这句话

In the case where there is not enough room, uncompress() will fill the output buffer with the uncompressed data up to that point.

所以你可以在压缩消息的开头包含长度。然后在您的目的地开始用一个小缓冲区解压缩。它可能不会将所有内容解压缩到小缓冲区中。但是如果你一开始就写,它解压缩足够你读取数据长度。然后您可以使用它来分配/调整目标缓冲区的大小并再次使用解压缩。

根据您的用例,这可能是个好主意,也可能不是。如果您的消息大小变化不大并且程序运行时间更长,那么最好只维护一个目标缓冲区并根据需要增加该缓冲区。

关于c++ - 如何假设 zlib 解压缩后的大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54570458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com