zlib로 gzip 스트림을 압축하려면 어떻게해야합니까?
문제
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
모듈도 이들을 지원합니다.
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()
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