আমি কীভাবে জিলিবি দিয়ে একটি জিপিপ স্ট্রিমটি সংক্ষেপণ করতে পারি?


108

জিজিপ ফর্ম্যাট ফাইল ( gzipউদাহরণস্বরূপ প্রোগ্রামের সাথে তৈরি ) "ডিফল্ট" সংক্ষেপণ অ্যালগরিদম ব্যবহার করে, যা zlib যা ব্যবহার করে একই সংকোচনের অ্যালগরিদম । যাইহোক, একটি জিজিপ সংক্ষেপিত ফাইল স্ফীত করতে zlib ব্যবহার করার সময়, গ্রন্থাগারটি a প্রদান করে Z_DATA_ERROR

জিজিপ ফাইলটি সংক্ষেপিত করতে আমি কীভাবে zlib ব্যবহার করতে পারি?

উত্তর:


118

Zlib সহ একটি gzip ফর্ম্যাট ফাইলটি সঙ্কুচিত করতে, প্যারামিটারের inflateInit2সাথে এইভাবে কল করুন :windowBits16+MAX_WBITS

inflateInit2(&stream, 16+MAX_WBITS);

আপনি যদি এটি না করেন তবে zlib খারাপ স্ট্রিম ফর্ম্যাট সম্পর্কে অভিযোগ করবে। ডিফল্টরূপে, zlib একটি zlib শিরোলেখ সহ স্ট্রিম তৈরি করে এবং স্ফীত অবস্থায় আপনি এটি না বললে বিভিন্ন gzip শিরোনামকে স্বীকৃতি দেয় না। যদিও এটি zlib.hশিরোনাম ফাইলটির 1.2.1 সংস্করণে শুরু করে নথিভুক্ত করা হয়েছে , এটি zlib ম্যানুয়ালটিতে নেই । হেডার ফাইল থেকে:

windowBitsalচ্ছিক জিজিপ ডিকোডিংয়ের জন্য 15 এরও বেশি হতে পারে। windowBitsস্বয়ংক্রিয় শিরোনাম শনাক্তকরণ শনাক্তকরণের সাথে zlib এবং gzip ডিকোডিং সক্ষম করতে 32 যুক্ত করুন বা কেবল gzip ফর্ম্যাটটি ডিকোড করতে 16 যুক্ত করুন (zlib ফর্ম্যাটটি ফিরে আসবে Z_DATA_ERROR)। যদি কোনও strm->adlerজিজিপ স্ট্রিমটি ডিকোড করা হয় তবে এটি অ্যাডলার 32 এর পরিবর্তে crc32।


35
পাইথনে:zlib.decompress(data, 15 + 32)
রোমান স্টারকভ

3
ধন্যবাদ, আমি এই পোস্টটি না পাওয়া পর্যন্ত এটি অত্যন্ত হতাশাব্যঞ্জক ছিল।
অ্যালেক্স

বাহ, এটি ২০০৯ এর প্রশ্ন। ধন্যবাদ @ গ্রেগ হিউগিল
ইউ ইউ শাওলিন মাকুলেলি লাই

সম্ভবত আপনি জিপিপ স্ট্রিমের পুনরাবৃত্তিক সংক্ষেপণের জন্য কিছু গাইডলাইন সরবরাহ করতে পারেন। এক-শট গিজিপ ডিকম্প্রেশনটিতে যেখানে আপনার আউটপুট স্ট্রিম এবং আকারটি স্থির করা উচিত এবং পুরো ডিসপ্রেসড আউটপুট সংরক্ষণের জন্য যথেষ্ট। এই মানটি জিজিপ ডিকম্প্রেশন কার্যকারিতার উপর নির্ভর করে যা ডেটা এনট্রপি অনুসারে পরিবর্তিত হতে পারে। প্রয়োজনে আউটপুট বাফারকে আরও স্থান বরাদ্দ দেওয়ার কোনও উপায় আছে কি? ধন্যবাদ
জোহর 8১

104

পাইথন

zlibলাইব্রেরি সমর্থন করে :

পাইথন zlibমডিউল এগুলিও সমর্থন করবে will

উইন্ডোবিট নির্বাচন করা

তবে এই zlibসমস্ত ফর্ম্যাটগুলি সঙ্কুচিত করতে পারে:

  • (ডি-) সংক্ষেপণ deflateবিন্যাস, ব্যবহার করুনwbits = -zlib.MAX_WBITS
  • (ডি-) সংক্ষেপণ zlibবিন্যাস, ব্যবহার করুনwbits = zlib.MAX_WBITS
  • (ডি-) সংক্ষেপণ gzipবিন্যাস, ব্যবহার করুনwbits = zlib.MAX_WBITS | 16

Http://www.zlib.net/manual.html# অ্যাডভান্সড (বিভাগ 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ব্যবহারগুলি zlib

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

3
কেন এই স্বর্ণের টুকরাটি সঠিক বিন্যাসে ডক্সে নেই?
রামন মোরেস

দয়া করে এই উত্তরটির কোনওটি ব্যবহার করে সিপাইথনের বিরুদ্ধে একটি টান অনুরোধ / প্যাচ পাঠাতে নির্দ্বিধায় অনুভব করুন।
dnozay

স্ট্রিংয়ের দুর্দান্ত উত্তর, মেমরির পুরো ফাইলটি না পড়ে কোনও স্ট্রিমের জন্য এটি কীভাবে করবেন কোনও ধারণা?
জোশ জে

ধন্যবাদ. আমি আপনার উত্তরের সাথে আমার উত্স কোডে আমার ডেকপ্রেস সমস্যাটি সমাধান করতে পারি।
বেথলি

অবিশ্বাস্য, এটি একটি সোনার ন্যুগেট .. তবে আমি সাহায্য করতে পারছি না তবে এইগুলি 'ম্যাজিক সংখ্যার' সমান মনে হয়? নথিতে কোথায় এটি উল্লেখ করা হয়েছে? আমি দেখেছি, তবে অবশ্যই যথেষ্ট শক্তভাবে চেক করা উচিত নয় .. এছাড়াও, স্বরলিপিটি আমি পুরোপুরি অনুসরণ করি না। কি করে | মানে, এটি alচ্ছিক? এবং কেন ডিফল্ট নেতিবাচক .. .. MAX_WBITS একটি ধ্রুবক .. 🙁
m1nkeh

3

জ্লিব এবং জিজিপের গঠন আলাদা different zlib আরএফসি 1950 ব্যবহার করে এবং জিজিপ আরএফসি 1952 ব্যবহার করে , সুতরাং বিভিন্ন শিরোনাম রয়েছে তবে বাকীগুলির একই কাঠামো রয়েছে এবং আরএফসি 1951 অনুসরণ করে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.