2

zlib を使用してメモリの小さなブロック (<= 16 KiB) を圧縮したいと考えています。出力もメモリのブロックに保存されます。ここでは、ディスクまたはデータベースへのアクセスはありません。

ドキュメントによると、deflate()入力全体が収縮するまで繰り返し呼び出す必要があります。その間に、出力先のメモリ ブロックのサイズを大きくする必要があります。

しかし、それは不必要に複雑で、おそらく非効率的ですらあります。入力のサイズを知っているので、出力に必要な最大サイズを事前に決定してから、 を 1 回呼び出すだけですべてを行うことはできませんdeflate()か?

もしそうなら、最大出力サイズはいくつですか? 私は次のようなものを想定しています:入力のサイズ+いくつかのバイトのオーバーヘッド

4

1 に答える 1

8

zlib には、バッファーが収縮する最大サイズを計算する関数があります。あなたの仮定は正しいです - 返される値は、入力バッファのサイズ + ヘッダーのサイズです。デフレの後、バッファを再割り当てして、「無駄な」メモリを再利用できます。
zlib.h から:

ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen));
/*
   deflateBound() returns an upper bound on the compressed size after
   deflation of sourceLen bytes.  It must be called after deflateInit() or
   deflateInit2(), and after deflateSetHeader(), if used.  This would be used
   to allocate an output buffer for deflation in a single pass, and so would be
   called before deflate().
*/
于 2011-02-08T21:02:05.007 に答える