Saya telah membuat data yang dikompresi zlib dengan Python, seperti ini:
import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
f.write(z)
(atau satu-liner shell: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data
)
Sekarang, saya ingin mengompres data dalam shell. Tidak zcat
juga tidak uncompress
berfungsi:
$ 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
Tampaknya saya telah membuat file seperti gzip, tetapi tanpa header. Sayangnya saya tidak melihat opsi untuk mengompres data mentah seperti itu di halaman manual gzip, dan paket zlib tidak mengandung utilitas yang dapat dieksekusi.
Apakah ada utilitas untuk mengompresi data zlib mentah?
compression
gzip
mykhal
sumber
sumber
Jawaban:
Dimungkinkan juga untuk mendekompresnya menggunakan shell-script + gzip standar , jika Anda tidak punya, atau ingin menggunakan openssl atau alat lain.
Caranya adalah dengan menambahkan angka ajaib gzip dan metode kompres ke data aktual dari
zlib.compress
:Suntingan:
@ d0sboots berkomentar: Untuk data RAW Deflate, Anda perlu menambahkan 2 byte null lagi:
→
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"
Q on SO ini memberikan informasi lebih lanjut tentang pendekatan ini. Jawaban di sana menunjukkan bahwa ada juga 8 byte footer.
Users @ Vitali-Kushner dan @ mark-bessey melaporkan keberhasilan bahkan dengan file yang terpotong, jadi gzip footer sepertinya tidak diperlukan sepenuhnya.
@ tobias-kienzler menyarankan fungsi ini untuk bashrc :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)
sumber
Pengguna @tino berkomentar di bawah jawaban OpenSSL tapi saya pikir ini harus terpisah:
Saya mencoba ini dan itu berhasil untuk saya.
zlib-flate
dapat ditemukan dalam paketqpdf
(di Debian Squeeze dan Fedora 23, sesuai dengan komentar di jawaban lain)sumber
zlib-flate
menginstal di macOS? Saya tidak melihatnya di mana pun.qpdf
paket yang saya instal dengan yangbrew
disebutkan dalam komentar di atas - atau lihat kalimat terakhir dari jawaban ini :). Juga,qpdf
sangat keren, jadi lihatlah juga jika Anda punya waktu!Saya telah menemukan solusi (salah satu yang mungkin), menggunakan openssl :
atau
* CATATAN: fungsionalitas zlib tampaknya tersedia dalam versi openssl terbaru> = 1.0.0 (OpenSSL harus dikonfigurasi / dibangun dengan opsi zlib atau zlib-dinamis, yang terakhir adalah default)
sumber
zlib-flate
dalamqpdf
paket. Dapat digunakan sepertizlib-flate -uncompress < FILE
.Saya merekomendasikan pigz dari Mark Adler , rekan penulis perpustakaan kompresi zlib. Jalankan
pigz
untuk melihat bendera yang tersedia.Anda akan melihat:
-z --zlib Compress to zlib (.zz) instead of gzip format.
Anda dapat membuka kompresi menggunakan
-d
flag:-d --decompress --uncompress Decompress the compressed input.
Dengan asumsi file bernama 'test':
pigz -z test
- membuat file terkompresi zlib bernama test.zzpigz -d -z test.zz
- Mengonversi test.zz ke file tes yang didekompresiPada OSX Anda dapat menjalankan
brew install pigz
sumber
unpigz test.zz
akan berfungsi juga.$>file hello.txt.zz
hello.txt.zz: zlib compressed data
zlib
mengimplementasikan kompresi yang digunakan oleh gzip, tetapi bukan format file. Sebagai gantinya, Anda harus menggunakangzip
modul , yang digunakan sendirizlib
.sumber
zlib
dan mengkompres mereka dengangzip
, jika Anda masih belum memiliki data asli.Ini mungkin melakukannya:
Kemudian jalankan seperti ini:
sumber
zlib.decompress
. mungkin saya akan menggunakan beberapa fungsi berjalan. Saya tidak yakin apakah shell akan menangani sejumlah besar file saya dengan glob wildcard :)file
perintah shell ? Bagaimana itu?Contoh program yang
zpipe.c
ditemukan di sini oleh Mark Adler sendiri (dilengkapi dengan distribusi sumber perpustakaan zlib) sangat berguna untuk skenario ini dengan data mentah zlib. Mengkompilasi dengancc -o zpipe zpipe.c -lz
dan untuk dekompresi:zpipe -d < raw.zlib > decompressed
. Bisa juga melakukan kompresi tanpa-d
flag.sumber
Pada macOS, yang merupakan UNIX compliant penuh UNIX (bersertifikat resmi!), Tidak
OpenSSL
memilikizlib
dukungan, tidak ada yangzlib-flate
baik dan sementara solusi pertama bekerja serta semua solusi Python, solusi pertama membutuhkan data ZIP berada dalam file dan semua solusi lain memaksa Anda untuk membuat skrip Python.Inilah solusi berbasis Perl yang dapat digunakan sebagai command-line one-liner, mendapatkan inputnya melalui pipa STDIN dan yang bekerja di luar kotak dengan macOS yang baru diinstal:
Lebih bagus diformat, skrip Perl terlihat seperti ini:
sumber
Anda dapat menggunakan ini untuk kompres dengan zlib:
Dan ini untuk mengempis:
sumber
unknown option '-z'
pada Ubuntu 16.04 danOpenSSL 1.0.2g 1 Mar 2016
bekerja untuk saya di fedora25
sumber
zcat
hanya berfungsi dengan file dalam format gzip.