2011-05-04 1 views
2

여기 python에서 zlib 또는 gzip 모듈을 사용하여 데이터의 압축을 푸는 것에 대한 많은 질문과 대답을 알고 있습니다. 그러나 gzip은 zlib을 기반으로하기 때문에 gzip이 어떻게 구현하는지 궁금합니다.
gzip의 소스를 읽고 zlib를 사용하여 wbits가 -15로 설정된 청크로 데이터 청크를 압축 해제하는 것을 발견했습니다.
그러나 zlib을 wbits -15로 압축을 풀 때 직접 사용하면 wbits 15 + 16에서만 작동하는 "invalid block type"이 표시됩니다.왜 zlib을 사용하여 gzip의 스타일과 같은 문자열을 압축 해제 할 수 없습니까?

나는 15 + 16을 사용해야하는 이유를 알고 있지만 gzip은 -15를 사용할 수있는 이유를 모르지만 그럴 수는 없습니다. 광산 모듈과 gzip 모듈 간의 구현 차이점은 누가 알고 있습니까?

답변

2

zlib 모듈은 wbits 매개 변수를 실제 zlib 라이브러리에 직접 전달합니다. 이 파일은 windowBits이라고하며 zlib manual에 설명되어 있습니다. 관련 섹션을 인용 해 드리겠습니다 :

windowBits는 원시 수축을 위해 -8 ..- 15 일 수도 있습니다. 이 경우 -windowBits가 창 크기를 결정합니다. deflate()는 zlib 헤더 나 트레일러없이 원시 deflate 데이터를 생성하고 adler32 검사 값을 계산하지 않습니다.

gzip 모듈은 헤더 구문 분석 및 생성 자체를 수행하므로 zlib에이를 회피해야합니다. 그렇지 않으면 두 개의 zlib 헤더와 압축 된 압축 파일이 생깁니다.