UNIX'te zlib verilerini açmak nasıl?


106

Python'da zlib sıkıştırılmış veri oluşturdum, şöyle:

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

(ya da kabuk içinde bir liner: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data)

Şimdi, kabuktaki verileri açmak istiyorum. Ne iş ne zcatde 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

Görünüşe göre gzip benzeri bir dosya oluşturdum ama başlıkları olmadan. Ne yazık ki, gzip man sayfasında bu tür ham verileri açmak için herhangi bir seçenek görmüyorum ve zlib paketi herhangi bir çalıştırılabilir yardımcı program içermiyor.

Ham zlib verilerini açmak için bir yardımcı program var mı?


Yanıtlar:


140

Eğer yoksa veya veya başka araçlar kullanmak istiyorsanız standart + kullanarak sıkıştırmasını açmak da mümkündür . İşin püf noktası, gzip magic numarasını hazırlamak ve yöntemi asıl verilere sıkıştırmaktır :
zlib.compress

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

Düzenlemeler:
@ d0sboots yorum yaptı: RAW Deflate verileri için 2 boş bayt eklemeniz gerekir:
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"

SO hakkındaki bu soru, bu yaklaşım hakkında daha fazla bilgi verir. Buradaki cevap, 8 baytlık bir altlığın da olduğunu göstermektedir.

Users @ Vitali-Kushner ve @ mark-bessey kesilmiş dosyalarla bile başarılı olduğunu bildirdi, bu yüzden bir gzip altbilgi kesinlikle gerekli görünmüyor.

@ tobias-kienzler bu işlevi için önerdi :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)


gzip çalışmıyor, ancak zlib-flate çalışıyor (pdf page content stream).
Daneel S. Yaitskov

69

Kullanıcı @tino, OpenSSL yanıtının altında yorum yaptı, ancak bunun ayrı olması gerektiğini düşünüyorum:

zlib-flate -uncompress < FILE

Bunu denedim ve benim için çalıştı.

zlib-flatepaketinde bulunabilir qpdf(diğer cevaplardaki yorumlara göre, Debian Squeeze ve Fedora 23'te)


3
Diğer cevapların aksine, bu OS X üzerinde çalışır
polim

2
@polym, macOS'a nasıl zlib-flate yüklediniz ? Hiçbir yerde göremiyorum.
Wildcard

4
@Wildcard geç cevap için özür dilerim. Yukarıdaki yorumda belirtildiği gibi kurduğum qpdfpakete girdiğimi düşünüyorum - ya da bu cevabın son cümlesine bakalım :). Ayrıca, gerçekten çok havalı, eğer vaktiniz varsa bakın! brewqpdf
polim

demlemek qpdf yüklemek, sonra yukarıda listelenen komut :-) teşekkür ederim!
Fernando Gabrieli

60

Bir çözüm buldum (muhtemel olanlardan biri), openssl kullanıyor :

$ openssl zlib -d < /tmp/data

veya

$ openssl zlib -d -in /tmp/data

* NOT: zlib işlevselliği, son openssl sürümlerinde> = 1.0.0 görünüşte mevcuttur (OpenSSL, zlib veya zlib-dinamik seçeneğiyle yapılandırılmış / oluşturulmuş olmalıdır, ikincisi varsayılandır)


25
(OpenSSL'yi 0.9.8 vardır) Debian sıkıştırıp orada zlib-flateiçinde qpdfpaketin. Gibi kullanılabilir zlib-flate -uncompress < FILE.
Tino,

7
zlib, OpenSSL'in son sürümlerinden kaldırıldı, bu yüzden bu ipucu çok yardımcı oldu: @Tino
Alexandr Kurilin

1
Teşekkürler. Bu çözüm, kısa giriş dosyalarının sıkıştırılmasında "gzip" ("dosyanın beklenmedik bir şekilde sonlandırılması" sırasında "gzip" iptal edilirken "gzip" ile mümkün olduğu kadar sıkıştırılmış) kullanarak cevaptan daha iyi bir deneyim sağlar.
Daniel K.

2
@Tino bu ayrı bir cevap olmalı
Catskul

1
@Tino, ayrıca Fedora 23'teki qpdf paketi ile de edinilebilir. Alexandr Kurilin, zlib hala 1.0.2d-fips'te mevcuttur.
maxschlepzig

28

Ben tavsiye pigz gelen Mark Adler , zlib sıkıştırma kütüphanesi ortak yazarlarından. pigzMevcut bayrakları görmek için yürütün .

Fark edeceksiniz:

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

-dBayrağı kullanarak sıkıştırmayı açabilirsiniz :

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

'Test' adında bir dosya varsayarak:

  • pigz -z test - test.zz adlı bir zlib sıkıştırılmış dosya oluşturur
  • pigz -d -z test.zz - test.zz dosyasını sıkıştırılmış test dosyasına dönüştürür

OSX'te çalıştırabilirsiniz brew install pigz


7
İyi bulmak! Zlib dosyalarını kendi başına tespit edebiliyor gibi görünüyor, bu yüzden unpigz test.zzde işe yarayacak.
Stéphane Chazelas 26:16

verilerimi açmadı.
cybernard

1
@cybernard belki de bir zlib dosyanız yoktur. ile kontrol edin:$>file hello.txt.zz hello.txt.zz: zlib compressed data
snodnipper

11

zlibgzip tarafından kullanılan, ancak dosya formatı tarafından kullanılan sıkıştırmayı uygular. Bunun yerine, kullandığı gzipmodülü kullanmalısınız zlib.

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

Tamam, ama benim durumum :) .. ben oluşturulan bu dosyaların onlarca / yüzlerce binlerce var, bu yüzden olmasıdır

1
bu yüzden ... dosyalarınız eksik. Belki de özgün verileriniz yoksa, zlibbunları gzipaçmanız ve yeniden sıkıştırmanız gerekebilir.
Greg Hewgill

6
@ mykhal, neden gerçekten açabileceğinizi kontrol etmeden önce neden on / yüz binlerce dosya yarattınız?

3
harpyon, ben sadece tekrar python yapmak istemiyorsanız az veya daha fazla urility veya zgip ayarları ortak, bunun için kullanılabilecek acaba, bunları sıkıştırmasını olabilir

3

Bu yapabilir:

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)

Öyleyse şöyle yap:

$ python expander.py data/*

teşekkürler, biliyorum zlib.decompress. Muhtemelen bazı yürüyüş fonksiyonlarını kullanırdım. Shell, glob joker ile benim büyük miktarda dosya işleyeceğini emin değilim :)

Genişletme tarafından oluşturulan dosya, shell filekomutunu kullanarak hala benim için "zlib sıkıştırılmış veri" olarak bakıyor. Bu nasıl?
K.-Michael Aye,

hayır, sahte başlıkla bile benim için çalışmıyor.
cybernard

3

zpipe.c Burada Mark Adler'in kendisi tarafından bulunan örnek program (zlib kütüphanesinin kaynak dağıtımıyla birlikte gelir), ham zlib verileri içeren bu senaryolar için çok faydalıdır. İle derlemek cc -o zpipe zpipe.c -lzve sıkıştırmasını: zpipe -d < raw.zlib > decompressed. Ayrıca -dbayrak olmadan da sıkıştırma yapabilir .


2

Tam POSIX uyumlu bir UNIX olan (resmen onaylı!) Olan macOS'ta destek OpenSSLyok, hiçbir zlibdestek yok zlib-flateve ilk çözümün yanı sıra tüm Python çözümlerinin çalışmasına rağmen, ilk çözüm ZIP verilerinin bir dosyada olmasını gerektiriyor ve diğer tüm çözümler sizi bir Python betiği oluşturmaya zorlar.

İşte bir liner komut satırı olarak kullanılabilen, girişini STDIN borusu aracılığıyla alan ve yeni kurulmuş bir macOS ile kutudan çıkan Perl tabanlı bir çözüm:

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

Daha hoş biçimlendirilmiş, Perl betiği şöyle görünür:

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

1

Bunu zlib ile sıkıştırmak için kullanabilirsiniz:

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

Ve bunu söndürmek için:

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

4
Verir unknown option '-z'Ubuntu 16.04 ve üzerindeOpenSSL 1.0.2g 1 Mar 2016
Tino

2
Mac'te de aynı hata
K.-Michael Aye

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.