2013-08-06 3 views
2

나는 이전에 deflate()로 수축 시켰던 메모리의 버퍼를 팽창시키고있다.zlib의 inflate 함수에 출력 버퍼를 어떻게 할당 할 수 있습니까?

문제는 inflate()를 호출 할 때마다 출력 버퍼의 크기를 조정해야 할 때가 아닌 것 같습니다.

Zlib 예제는 단순히 비정상적으로 데이터가 버퍼를 오버런하지 않는다고 가정하기 때문에이 문제가 없습니다.

누구든지이 문제를 해결 했습니까?

+0

일반적으로'inflate'를 호출하면 오류가 반환 될 때까지 고정 크기 버퍼가있는 루프에서'inflate'를 호출합니다. –

+0

Jonathan의 덧글에 추가하거나 'inflate()'이 ** Z_STREAM_END **을 반환 할 때까지. 압축 후, total_in은 압축되지 않은 데이터의 전체 크기를 저장하고 압축 해제기에 사용하기 위해 저장할 수 있습니다 (특히 압축 해제 기가 압축 해제 된 데이터를 압축 해제하려는 경우 특히 유용합니다). 단일 단계). "* – WhozCraig

답변

3

어떤 zlib 예를 언급하고 있습니까? 내가 아는 사람들은 그런 가정을하지 않습니다. inflate()에 얼마나 많은 공간이 출력 버퍼에 있는지, avail_out라고 말하면 압축 해제 된 데이터 만 쓸 것입니다. 버퍼가 오버런되지 않습니다. 그런 다음 해당 데이터로 수행해야하는 모든 작업을 수행하고 inflate()으로 다시 전화하여 next_inavail_in을 재설정하여 동일한 버퍼를 다시 사용합니다.

zlib 사용 방법은 this heavily annotated example입니다.

realloc()을 암시하는 것처럼 단일 버퍼로 모든 것을 읽고 싶습니까? 이 경우 avail_out이 0으로 가고, 버퍼를 다시 할당하고, realloc()이 버퍼를 이동할 수 있으므로 avail_out (및 next_out)을 업데이트하고 inflate()을 다시 호출하면됩니다.

+0

나는 avail_out을 완전히 오해하고있었습니다. 여기서 설명하는 내용은 문서보다 훨씬 이해하기 쉽습니다. 감사. – Erix

관련 문제