मैं zlib के साथ एक gzip स्ट्रीम कैसे decompress कर सकते हैं?




inflate (3)

Gzip प्रारूप फ़ाइलें (उदाहरण के लिए, gzip प्रोग्राम के साथ बनाई गई) "डिफ्लेट" संपीड़न एल्गोरिदम का उपयोग करें, जो एक ही संपीड़न एल्गोरिदम है जो zlib का उपयोग करता है। हालांकि, एक gzip संपीड़ित फ़ाइल को बढ़ाने के लिए zlib का उपयोग करते समय, लाइब्रेरी एक Z_DATA_ERROR

मैं gzip फ़ाइल को डिकंप्रेस करने के लिए zlib का उपयोग कैसे कर सकता हूं?


अजगर

zlib लाइब्रेरी का समर्थन करता है :

पायथन zlib मॉड्यूल भी इन का समर्थन करेगा।

विंडो बिट्स चुनना

लेकिन zlib उन सभी प्रारूपों को zlib कर सकता है:

  • ( wbits = -zlib.MAX_WBITS ) wbits = -zlib.MAX_WBITS प्रारूप को संपीड़ित करें, wbits = -zlib.MAX_WBITS उपयोग करें
  • zlib प्रारूप को संपीड़ित करने के लिए, wbits = zlib.MAX_WBITS उपयोग करें
  • gzip प्रारूप को संपीड़ित करने के लिए, wbits = zlib.MAX_WBITS | 16 उपयोग करें 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)

windowBits 32 जोड़ना हेडर डिटेक्शन ट्रिगर करेगा

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

इसके बजाय gzip का उपयोग कर

Gzip शीर्षलेख के साथ gzip डेटा के लिए आप सीधे gzip मॉड्यूल का उपयोग कर सकते हैं; लेकिन कृपया याद रखें कि हुड के नीचे , gzip zlib का उपयोग करता zlib

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

Zlib और gzip की संरचना अलग है। zlib आरएफसी 1 9 50 का उपयोग करता है और जीजीआईपी आरएफसी 1 9 52 का उपयोग करता है, इसलिए अलग-अलग शीर्षलेख होते हैं लेकिन शेष की एक ही संरचना होती है और आरएफसी 1 9 51 का पालन ​​करती है।


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