UNIX में zlib डेटा को कैसे अनकैप करें?


106

मैंने पायथन में इस तरह से zlib- कम्प्रेस्ड डेटा बनाया है:

import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
    f.write(z)

(या खोल में एक लाइनर: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data)

अब, मैं शेल में डेटा को अनसुना करना चाहता हूं। न तो zcatहै और न ही uncompressकाम:

$ cat /tmp/data | gzip -d -
gzip: stdin: not in gzip format

$ zcat /tmp/data 
gzip: /tmp/data.gz: not in gzip format

$ cat /tmp/data | uncompress -
gzip: stdin: not in gzip format

ऐसा लगता है कि मैंने gzip जैसी फ़ाइल बनाई है, लेकिन बिना किसी हेडर के। दुर्भाग्य से मुझे gzip मैन पेज में इस तरह के कच्चे डेटा को अनलॉक्ड करने का कोई विकल्प नहीं दिखता है, और zlib पैकेज में कोई निष्पादन योग्य उपयोगिता नहीं है।

क्या कच्चे ज़लीब डेटा को अनसुना करने की उपयोगिता है?


यहाँ कई अतिरिक्त उत्तर हैं: stackoverflow.com/questions/3178566/deflate-command-line-tool
जैक ओ'कॉनर

जवाबों:


140

यदि आपके पास मानक + का उपयोग करके इसे विघटित करना भी संभव है , यदि आपके पास या अन्य टूल का उपयोग नहीं करना है ।
ट्रिक gzip मैजिक नंबर को प्रिपेंड करने और वास्तविक डेटा को कंप्रेस विधि से करने के लिए है zlib.compress:

printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - /tmp/data |gzip -dc >/tmp/out

संपादन:
@ d0sboots ने टिप्पणी की: RAW ख़राब डेटा के लिए, आपको 2 और null बाइट्स जोड़ने की आवश्यकता है:
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"

एसओ पर यह क्यू इस दृष्टिकोण के बारे में अधिक जानकारी देता है। वहां एक उत्तर बताता है कि एक 8 बाइट पाद भी है।

उपयोगकर्ता @ विटाली-कुशनेर और @ मार्क-बेसी ने छंटनी की गई फ़ाइलों के साथ भी सफलता की सूचना दी है, इसलिए एक गज़िप पाद को कड़ाई से आवश्यक नहीं लगता है।

@ टोबियास-kienzler के लिए इस समारोह का सुझाव दिया :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)


gzip काम नहीं करता है, लेकिन zlib-flate करता है (pdf पृष्ठ सामग्री स्ट्रीम)।
डैनियल एस। यित्सकोव

69

उपयोगकर्ता @tino ने ओपनएसएसएल उत्तर के नीचे टिप्पणी की लेकिन मुझे लगता है कि यह अलग होना चाहिए:

zlib-flate -uncompress < FILE

मैंने यह कोशिश की और यह मेरे लिए काम कर गया।

zlib-flateपैकेज में पाया जा सकता है qpdf(डेबियन निचोड़ और फेडोरा 23 में, अन्य उत्तरों में टिप्पणियों के अनुसार)


3
अन्य उत्तरों के विपरीत, यह OS X पर काम करता है।
polym

2
@polym, आप macOS पर कैसे zlib-flate स्थापित हुए? मैं इसे कहीं नहीं देखता।
वाइल्डकार्ड

4
देर से प्रतिक्रिया के लिए सॉरी सॉरी। मुझे लगता है कि यह उस qpdfपैकेज के साथ आया है जिसे मैंने ऊपर टिप्पणी के साथ स्थापित brewकिया है - या इस उत्तर के अंतिम वाक्य को देखें :)। इसके अलावा, यह वास्तव में अच्छा है, इसलिए यदि आपके पास समय हो तो इसे भी देखें! qpdf
पोलीम

brew स्थापित qpdf, तो ऊपर सूचीबद्ध आदेश :-) धन्यवाद!
फर्नांडो गैब्रियल

60

मुझे एक समाधान मिल गया है (संभावित लोगों में से एक), यह Opensl का उपयोग कर रहा है :

$ openssl zlib -d < /tmp/data

या

$ openssl zlib -d -in /tmp/data

* नोट: zlib कार्यक्षमता जाहिरा तौर पर हाल ही में खुलने वाले संस्करणों में उपलब्ध है = = 1.0.0 (ओपनएसएसएल को zlib या zlib- डायनामिक विकल्प के साथ कॉन्फ़िगर / निर्मित किया जाना है, बाद वाला डिफ़ॉल्ट है)


25
डेबियन निचोड़ (जो OpenSSL 0.9.8 है) पर है zlib-flateमें qpdfपैकेज। इसका उपयोग किया जा सकता है zlib-flate -uncompress < FILE
टीनो

7
zlib OpenSSL के तो इस टिप है नवीनतम संस्करण से हटा दिया गया बहुत उपयोगी @Tino है
अलेक्सेंद्र Kurilin

1
धन्यवाद। यह समाधान "gzip" ("खुलता है" विघटित का उपयोग करके उत्तर की तुलना में शॉर्ट इनपुट फ़ाइलों को डिकम्प्रेस करने में बेहतर अनुभव प्रदान करता है, जबकि "gzip" ने "फ़ाइल का अप्रत्याशित अंत" प्रिंट किया है।)
डैनियल के।

2
@ यह एक अलग जवाब होना चाहिए
Catskul

1
@ टिनो, यह Fedora 23 पर पैकेज qpdf के माध्यम से भी उपलब्ध है। अलेक्जेंडर कुरिलिन, zlib अभी भी 1.0.2d-fips में उपलब्ध है।
मैक्सचेलपिजिग

28

मैं zlib संपीड़न लाइब्रेरी के सह-लेखक मार्क एडलर से पिगज़ की सिफारिश करता हूं । उपलब्ध झंडे देखने के लिए निष्पादित करें।pigz

तुम्हें पता चल जाएगा:

-z --zlib Compress to zlib (.zz) instead of gzip format.

आप -dध्वज का उपयोग कर सकते हैं :

-d --decompress --uncompress Decompress the compressed input.

'परीक्षण' नामक एक फ़ाइल मानकर:

  • pigz -z test - test.zz नाम की एक zlib संपीड़ित फ़ाइल बनाता है
  • pigz -d -z test.zz - विघटित परीक्षण फ़ाइल के लिए test.zz धर्मान्तरित

OSX पर आप निष्पादित कर सकते हैं brew install pigz


7
अच्छा खोजो! ऐसा लगता है कि यह अपने आप zlib फ़ाइलों का पता लगा सकता है, इसलिए unpigz test.zzयह भी काम करेगा।
स्टीफन चेजलस

मेरा डेटा विघटित नहीं किया।
साइबरनार्ड

1
@cybernard शायद आपके पास zlib फ़ाइल नहीं है। के साथ जाँच करें:$>file hello.txt.zz hello.txt.zz: zlib compressed data
12

11

zlibGzip द्वारा उपयोग किए जाने वाले संपीड़न को लागू करता है, लेकिन फ़ाइल प्रारूप को नहीं। इसके बजाय, आपको gzipमॉड्यूल का उपयोग करना चाहिए , जो स्वयं का उपयोग करता है zlib

import gzip
s = '...'
with gzip.open('/tmp/data', 'w') as f:
    f.write(s)

ठीक है, लेकिन मेरी स्थिति यह है कि मेरे पास दसियों / सैकड़ों हज़ारों फाइलें हैं, इसलिए .. :)

1
इसलिए ... आपकी फाइलें अधूरी हैं। यदि आपके पास अभी भी मूल डेटा नहीं है, तो शायद आपको उनके साथ फिर zlibसे जुड़ना होगा और उनके साथ पुन: जुड़ना होगा gzip
Greg में ग्रेग हेवगिल सेप

6
@mykhal, आपने दस / सौ हजारों फाइलें जाँचने से पहले क्यों बनाईं कि आप वास्तव में उन्हें अनलॉक्ड कर सकते हैं?

3
हार्पीओन, मैं उन्हें अनसुना कर सकता हूं, मुझे आश्चर्य है कि कम या अधिक सामान्य उतावलापन या zgip सेटिंग्स का उपयोग उस के लिए किया जा सकता है, अगर मैं इसे फिर से अजगर में नहीं करना चाहता हूं

3

यह यह कर सकता है:

import glob
import zlib
import sys

for filename in sys.argv:
    with open(filename, 'rb') as compressed:
        with open(filename + '-decompressed', 'wb') as expanded:
            data = zlib.decompress(compressed.read())
            expanded.write(data)

फिर इसे इस तरह से चलाएं:

$ python expander.py data/*

धन्यवाद, मैं के बारे में पता zlib.decompress। शायद मैं कुछ वॉक फंक्शन का उपयोग करता हूँ। मुझे यकीन नहीं है कि अगर गोला भारी वाइल्डकार्ड के साथ फाइलों की मेरी बड़ी मात्रा को संभाल

विस्तारित fileकमांड द्वारा बनाई गई फ़ाइल अभी भी शेल कमांड का उपयोग करके मेरे लिए "zlib संपीड़ित डेटा" के रूप में जांचती है ? यह कैसा है?
के।-माइकल

नकली हेडर के साथ भी मेरे लिए काम नहीं करेगा।
साइबरनार्ड

3

मार्क एडलर द्वारा स्वयं zpipe.c यहां पाया गया उदाहरण कार्यक्रम (zlib पुस्तकालय के स्रोत वितरण के साथ आता है) कच्चे ज़ालिब डेटा के साथ इन परिदृश्यों के लिए बहुत उपयोगी है। के साथ संकलन cc -o zpipe zpipe.c -lzऔर डिकम्प्रेस करने के लिए zpipe -d < raw.zlib > decompressed:। यह -dध्वज के बिना संपीड़न भी कर सकता है ।


2

MacOS पर, जो कि एक पूर्ण POSIX अनुरूप UNIX है (औपचारिक रूप से प्रमाणित!), OpenSSLका कोई zlibसमर्थन नहीं है , zlib-flateया तो कोई समाधान नहीं है और जबकि पहला समाधान सभी पायथन समाधानों के साथ-साथ काम करता है, पहले समाधान के लिए एक फाइल में जिप डेटा की आवश्यकता होती है। और अन्य सभी समाधान आपको पायथन स्क्रिप्ट बनाने के लिए मजबूर करते हैं।

यहां एक पर्ल आधारित समाधान है, जिसे कमांड लाइन वन-लाइनर के रूप में इस्तेमाल किया जा सकता है, इसका इनपुट STDIN पाइप के माध्यम से मिलता है और यह एक नए सिरे से स्थापित macOS के साथ बॉक्स से बाहर काम करता है:

cat file.compressed | perl -e 'use Compress::Raw::Zlib;my $d=new Compress::Raw::Zlib::Inflate();my $o;undef $/;$d->inflate(<>,$o);print $o;'

Nicer स्वरूपित है, पर्ल स्क्रिप्ट इस तरह दिखती है:

use Compress::Raw::Zlib;
my $decompressor = new Compress::Raw::Zlib::Inflate();
my $output;
undef $/;
$decompressor->inflate(<>, $output);
print $output;

1

आप इसे zlib के साथ संपीडित करने के लिए उपयोग कर सकते हैं:

openssl enc -z -none -e < /file/to/deflate

और यह अपस्फीति के लिए:

openssl enc -z -none -d < /file/to/deflate

4
देता है unknown option '-z'उबंटू 16.04 और परOpenSSL 1.0.2g 1 Mar 2016
टीनो

2
मैक पर समान त्रुटि
के।-माइकल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.