我有一些压缩的二进制数据和一个API调用来解压缩它需要一个预先分配的目标缓冲区。通过API没有任何方法可以告诉我解压缩数据的大小。所以我可以malloc一个超大的缓冲区来解压缩,但我想调整大小(或复制到)一个正确大小的内存缓冲区。那么,我如何(确实可以)确定超大缓冲区中解压缩二进制数据的实际大小?
(我不控制数据的压缩,所以我事先不知道预期的大小,我不能为文件写一个标题。)
答案 0 :(得分:2)
正如其他人所说,如果你的API没有提供,就没有好办法。
我几乎不想暗示这一点,因为担心你会接受这个建议并且你的应用程序中有一些任务关键部分依赖于它,但是......
在解压缩之前,一个heurstic将用一些“毒药”模式填充你的缓冲区。然后,在解压缩后,扫描缓冲区以查找第一次出现的毒药模式。
这是一种启发式方法,因为完全可以想象解压缩的数据可能恰好发生了你的毒药模式。除非您对数据的确切知识有所了解,否则可以选择一种您知道不存在的模式。
即便如此,最好还是一个不完美的解决方案。
答案 1 :(得分:0)
通常在压缩时提供此信息(例如,请查看7-zip LZMA SDK)。
无法通过您现在提供的信息知道解压缩数据的实际大小(或实际使用的部分的大小)。
答案 2 :(得分:0)
如果解压缩步骤没有以某种方式将解压缩后的大小作为返回值或“out”参数,则不能。
无法确定缓冲区中写入了多少数据(在调试器/ valgrind类型检查之外)。
答案 3 :(得分:0)
解决此问题的一种复杂方法是将两次解压缩到超大的缓冲区中。
在这两种情况下,您都需要“随机模式”。从结尾开始,计算与模式对应的字节数,并检测解压缩序列的不同之处。
还是吗?也许,偶然地,解压缩序列的最后一个字节对应于该确切位置处的随机字节。因此,最终的解压缩大小可能大于检测到的大小。如果您的模式是真正随机的,则不应超过几个字节。
您需要使用随机模式再次填充缓冲区,但需要另外一个。确保在每个位置 新的随机模式具有与旧随机模式不同的值 。为了更快的速度,您没有义务填充完整的缓冲区:您可以将新模式限制为之前的几个字节,并在第一个检测到的结束之后更多字节。 32个字节就足够了,因为很多字节不可能与第一个生成的随机模式相对应。
第二次解压缩。再次检测图案不同的位置。在第一次和第二次结束检测之间取两个值中较大的一个。这是你的减压尺寸。
答案 4 :(得分:-1)
你应该检查你的编译器/操作系统的免费工作方式 并做同样的事情。 free并不占用malloced数据的大小,但它知道多少可以正确释放;) 通常大小存储在分配的缓冲区之前,根据os / arch / compiler
再次知道maby字节的确切方式