ZLib 库有一个 CompressBuf 函数,其部分代码如下:
procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
out OutBuf: Pointer; out OutBytes: Integer);
...
begin
...
OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255; {*}
GetMem(OutBuf, OutBytes);
try
...
while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do begin {**}
P := OutBuf;
Inc(OutBytes, 256);
ReallocMem(OutBuf, OutBytes);
...
end;
据我了解,行 {*} 确定输出缓冲区的大小,考虑到数据可能不可压缩并且压缩结果将大于原始数据的事实。但是,从 {**} 块开始,即使这个大小也是第一个近似值,并且可能存在压缩数据的大小甚至更大的情况。
在这方面,我有一个问题:也许有人知道如何计算OutBytes需要分配的缓冲区的 [最佳 *] 大小,以保证它适合任何deflate()输入的输出,大小?InBytes
[*] 最优不一定是最小的(尽管它是可取的),而是合理的。那些。InBytes*2例如,如果保证足够,则不分配InBytes*1.25。
总的来说,感谢所有不明白问题所在的人。找到了这个文件,从中可以看出:
那些。事实证明,对于任何输入缓冲区,
InSize输出缓冲区的大小都足够了, size ,InSize + (InSize shr 14) * 5 + 11前提是使用了 flags或(即没有来自先前调用 deflate 的压缩数据)。Z_SYNC_FLUSHZ_FULL_FLUSHZ_FINISH