2014-09-04 2 views
0

일부 gzip 데이터의 압축을 푸는 데 문제가 있습니다. 동적으로 할당 된 char 문자열에 대한 포인터가있는 배열이 있습니다. 이 배열의 각 요소는 압축을 풀려는 gzip 파일의 일부입니다. 내 마음에 가장 먼저 오는 것은 이러한 문자열을 하나에 연결 한 다음 데이터를 압축 해제하는 것이지만 많은 복사 때문에이 방법을 피하고 싶습니다.zlib 라이브러리를 사용한 gzip 압축 해제

그래서 질문 : zlib 라이브러리를 사용하여 데이터를 몇 부분으로 나누어 압축 해제하는 방법이 있습니까? 나는 그것을하려고했지만, 첫 부분을 압축 해제 할 때 Z_DATA_ERROR를 얻습니다. 데이터가 완전하지 않기 때문에 정상입니다. 나머지 데이터가 압축 해제되도록 "대기"할 수있는 방법이 있습니까?

+1

본 적이 있습니까? https://hewgill.com/journal/entries/349-how-to-decompress-gzip-stream-with-zlib 청크로 여러 번 inflate()를 호출하여 하나씩 압축 해제 할 수 있어야합니다. .. –

+0

예, gzip 파일을 한 조각으로 압축 해제하는 데 문제가 없습니다. 나는 그 부분을 거의 가지고 있지 않을 때 무엇을해야할지 궁금합니다. 나는 그것을 하나씩하고 싶었지만 처음 파트를 압축 해제 할 때 Z_DATA_ERROR가 완료되지 않았기 때문에 압축이 풀리지 않았기 때문에 – user3131037

+1

[참조의 고급 기능] (http : //www.zlib)을 확인하십시오. .net/manual.html # Advanced)에서 콜백을 사용하여 데이터를 읽고 쓰는'inflateBack' 함수를 찾을 수 있습니다. –

답변

1

예. 각 문자열을 적절한 순서로 연속적으로 inflate() 번으로 호출하면됩니다. inflate()의 각 호출에 대해 압축 된 데이터에 대해 다른 포인터와 길이를 제공 할 수 있습니다. 매번 다음 번 입력으로 이동하기 전에 생성 된 압축되지 않은 데이터를 모두 먼저 사용하고 avail_in이 0인지 확인하십시오.

Z_DATA_ERROR가 나오면 원래 스트림을 올바르게 다시 어셈블하지 않았거나 원래 스트림이 gzip 스트림이 아님을 의미합니다.

gzip 스트림의 압축을 풀려면 inflateInit2()으로 초기화하고 매개 변수를 적절하게 설정하여 gzip 압축 풀기를 요청해야합니다.

관련 문제