2011-02-08 3 views
1

zlib을 사용하여 작은 메모리 블록 (< = 16 KiB)을 수축시키고 싶습니다. 출력은 메모리 블록에도 저장됩니다. 아니오 디스크 또는 데이터베이스 액세스는 여기에 있습니다.zlib : 치수 방법 avail_out

설명서에 따르면 전체 입력이 수축 될 때까지 반복해서 deflate()으로 전화해야합니다. 그 사이에 출력이 나오는 메모리 블록의 크기를 늘려야합니다.

그러나 불필요하게 복잡하고 비효율적 인 것처럼 보입니다. 입력 크기를 알기 때문에 출력에 필요한 최대 크기를 미리 결정한 다음 deflate()을 한 번만 호출하여 모든 작업을 수행 할 수 있습니까?

그렇다면 최대 출력 크기는 무엇입니까? 나는 다음과 같이 가정합니다 : 입력 크기 + 일부 바이트 오버 헤드

답변

7

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(). 
*/