W Pythonie utworzyłem dane skompresowane zlib, w następujący sposób:
import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
f.write(z)
(lub jednowarstwowy w skorupce echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data
)
Teraz chcę rozpakować dane w powłoce. Ani zcat
nie uncompress
działa:
$ 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
Wygląda na to, że utworzyłem plik podobny do gzipa, ale bez nagłówków. Niestety nie widzę żadnej opcji rozpakowywania takich surowych danych na stronie podręcznika gzip, a pakiet zlib nie zawiera żadnego narzędzia wykonywalnego.
Czy istnieje narzędzie do rozpakowywania surowych danych zlib?
compression
gzip
mykhal
źródło
źródło
Odpowiedzi:
Można go również zdekompresować za pomocą standardowego skryptu powłoki + gzip , jeśli nie masz lub chcesz użyć openssl lub innych narzędzi.
Sztuką jest dodanie magicznej liczby gzip i metoda kompresji do rzeczywistych danych z
zlib.compress
:Edycje:
@ d0sboots skomentował: W przypadku danych RAW Deflate należy dodać jeszcze 2 bajty puste:
→
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"
To pytanie dotyczące SO zawiera więcej informacji na temat tego podejścia. Odpowiedź sugeruje, że istnieje również 8-bajtowa stopka.
Użytkownicy @ Vitali-Kushner i @ mark-bessey zgłosili sukces nawet przy obciętych plikach, więc stopka gzip nie wydaje się ściśle wymagana.
@ tobias-kienzler zasugerował tę funkcję dla bashrc :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)
źródło
Użytkownik @tino skomentował odpowiedź OpenSSL, ale myślę, że powinna być osobna:
Próbowałem tego i zadziałało to dla mnie.
zlib-flate
można znaleźć w pakiecieqpdf
(w Debian Squeeze i Fedorze 23, zgodnie z komentarzami w innych odpowiedziach)źródło
zlib-flate
zainstalowany na macOS? Nigdzie tego nie widzę.qpdf
pakietem, który zainstalowałem,brew
jak wspomniano w komentarzu powyżej - lub spójrz na ostatnie zdanie tej odpowiedzi :). Ponadtoqpdf
jest naprawdę fajny, więc spójrz na to, jeśli masz czas!Znalazłem rozwiązanie (jedno z możliwych), używa ono openssl :
lub
* UWAGA: funkcjonalność zlib jest widocznie dostępna w najnowszych wersjach openssl> = 1.0.0 (OpenSSL musi być skonfigurowany / zbudowany z opcją zlib lub zlib-dynamic, ta ostatnia jest domyślna)
źródło
zlib-flate
wqpdf
pakiecie. Może być używany jakzlib-flate -uncompress < FILE
.Polecam pigza od Marka Adlera , współautora biblioteki kompresji zlib. Wykonaj,
pigz
aby zobaczyć dostępne flagi.Zauważysz:
-z --zlib Compress to zlib (.zz) instead of gzip format.
Możesz rozpakować za pomocą
-d
flagi:-d --decompress --uncompress Decompress the compressed input.
Zakładając plik o nazwie „test”:
pigz -z test
- tworzy skompresowany plik zlib o nazwie test.zzpigz -d -z test.zz
- konwertuje test.zz w zdekompresowany plik testowyW OSX można wykonać
brew install pigz
źródło
unpigz test.zz
będzie działać.$>file hello.txt.zz
hello.txt.zz: zlib compressed data
zlib
implementuje kompresję używaną przez gzip, ale nie format pliku. Zamiast tego powinieneś użyćgzip
modułu , który sam używazlib
.źródło
zlib
i ponownie skompresowaćgzip
, jeśli nadal nie masz oryginalnych danych.Może to zrobić:
Następnie uruchom go w następujący sposób:
źródło
zlib.decompress
. prawdopodobnie użyłbym funkcji chodzenia. Nie jestem pewien, czy powłoka będzie obsługiwać moją ogromną ilość plików z glob zamiennika :)file
polecenia powłoki ? W jaki sposób?Przykładowy program
zpipe.c
znaleziony tutaj przez samego Marka Adlera (pochodzi ze źródłowej dystrybucji biblioteki zlib) jest bardzo przydatny w tych scenariuszach z surowymi danymi zlib. Skompilowaćcc -o zpipe zpipe.c -lz
i dekompresji:zpipe -d < raw.zlib > decompressed
. Może także wykonywać kompresję bez-d
flagi.źródło
Na macOS, który jest w pełni zgodny z POSIX-em UNIX (formalnie certyfikowany!), Nie
OpenSSL
mazlib
wsparcia, nie ma żadnego zzlib-flate
nich, a podczas gdy pierwsze rozwiązanie działa tak samo jak wszystkie rozwiązania Python, pierwsze rozwiązanie wymaga, aby dane ZIP znajdowały się w pliku a wszystkie inne rozwiązania zmuszają cię do stworzenia skryptu Python.Oto rozwiązanie oparte na Perlu, które może być użyte jako jedno-liniowy wiersz poleceń, pobiera dane wejściowe za pośrednictwem potoku STDIN i działa od razu po zainstalowaniu systemu macOS:
Bardziej sformatowany skrypt Perla wygląda następująco:
źródło
Możesz użyć tego do kompresji za pomocą zlib:
I to do spuszczenia:
źródło
unknown option '-z'
na Ubuntu 16.04 iOpenSSL 1.0.2g 1 Mar 2016
działa dla mnie na fedora25
źródło
zcat
działa tylko z plikami w formacie gzip.