문제

GZIP 형식 파일 ( gzip 예를 들어 프로그램,) "Deflate"압축 알고리즘을 사용합니다. zlib 용도. 그러나 Zlib을 사용하여 GZIP 압축 파일을 팽창시킬 때 라이브러리는 A를 반환합니다. Z_DATA_ERROR.

Zlib을 사용하여 GZIP 파일을 압축하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

zlib로 gzip 형식 파일을 압축하려면 inflateInit2 이랑 windowBits 매개 변수로 16+MAX_WBITS, 이와 같이:

inflateInit2(&stream, 16+MAX_WBITS);

이 작업을 수행하지 않으면 Zlib은 잘못된 스트림 형식에 대해 불평합니다. 기본적으로 Zlib은 Zlib 헤더로 스트림을 생성하며 LaLate는 다른 GZIP 헤더를 인식하지 않으면 다른 GZIP 헤더를 인식하지 못합니다. 이것은 버전 1.2.1에서 시작하여 문서화되어 있지만 zlib.h 헤더 파일은 없습니다 Zlib 매뉴얼. 헤더 파일에서 :

windowBits 옵션 GZIP 디코딩의 경우 15보다 클 수 있습니다. 32를 추가하십시오 windowBits 자동 헤더 감지로 Zlib 및 Gzip 디코딩을 활성화하려면 16을 추가하여 GZIP 형식 만 디코딩합니다 (Zlib 형식은 Z_DATA_ERROR). GZIP 스트림이 디코딩되면 strm->adler Adler32 대신 CRC32입니다.

다른 팁

파이썬

zlib 도서관 지원:

파이썬 zlib 모듈도 이들을 지원합니다.

Windowbits 선택

하지만 zlib 모든 형식을 압축 할 수 있습니다.

  • (de-) 압축 deflate 형식, 사용 wbits = -zlib.MAX_WBITS
  • (de-) 압축 zlib 형식, 사용 wbits = zlib.MAX_WBITS
  • (de-) 압축 gzip 형식, 사용 wbits = zlib.MAX_WBITS | 16

문서를 참조하십시오 http://www.zlib.net/manual.html#advanced (부분 inflateInit2)

테스트 데이터 :

>>> deflate_compress = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS)
>>> zlib_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS)
>>> gzip_compress = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16)
>>> 
>>> text = '''test'''
>>> deflate_data = deflate_compress.compress(text) + deflate_compress.flush()
>>> zlib_data = zlib_compress.compress(text) + zlib_compress.flush()
>>> gzip_data = gzip_compress.compress(text) + gzip_compress.flush()
>>> 

명백한 테스트 zlib:

>>> zlib.decompress(zlib_data)
'test'

테스트 deflate:

>>> zlib.decompress(deflate_data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(deflate_data, -zlib.MAX_WBITS)
'test'

테스트 gzip:

>>> zlib.decompress(gzip_data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
zlib.error: Error -3 while decompressing data: incorrect header check
>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|16)
'test'

데이터는 또한 호환됩니다 gzip 기준 치수:

>>> import gzip
>>> import StringIO
>>> fio = StringIO.StringIO(gzip_data)
>>> f = gzip.GzipFile(fileobj=fio)
>>> f.read()
'test'
>>> f.close()

자동 헤더 감지 (Zlib 또는 GZIP)

첨가 32 에게 windowBits 헤더 감지를 트리거합니다

>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32)
'test'
>>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32)
'test'

사용 gzip 대신에

을 위한 gzip GZIP 헤더가있는 데이터를 사용할 수 있습니다 gzip 직접 모듈; 하지만 후드 아래에서 기억하십시오, gzip 용도 zlib.

fh = gzip.open('abc.gz', 'rb')
cdata = fh.read()
fh.close()

zlib와 gzip의 구조는 다릅니다. Zlib을 사용합니다 RFC 1950 GZIP 사용 RFC 1952, 다른 헤더가 있지만 나머지는 같은 구조를 가지고 있으며 다음을 따릅니다. RFC 1951.

node.js

const { gunzip } = require('zlib');

const decompressGzip = compressedData =>
  new Promise((resolve, reject) => {
    gunzip(compressedData, (error, decompressedData) => {
      if (error) return reject(error);
      return resolve(decompressedData);
    });
  });

module.exports = { decompressGzip };

당신은 설치합니다 zlib 원사 사용

yarn add zlib
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top