Eu criei dados compactados com zlib no Python, assim:
import zlib
s = '...'
z = zlib.compress(s)
with open('/tmp/data', 'w') as f:
f.write(z)
(ou de uma linha com casca: echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data
)
Agora, quero descompactar os dados no shell. Nem zcat
nem uncompress
trabalho:
$ 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
Parece que eu criei um arquivo semelhante ao gzip, mas sem nenhum cabeçalho. Infelizmente, não vejo nenhuma opção para descompactar esses dados brutos na página do manual gzip, e o pacote zlib não contém nenhum utilitário executável.
Existe um utilitário para descompactar dados brutos do zlib?
compression
gzip
mykhal
fonte
fonte
Respostas:
Também é possível descompactá-lo usando o shell-script + gzip padrão , se você não tiver, ou quiser usar o openssl ou outras ferramentas.
O truque é anexar o número mágico gzip e compactar o método aos dados reais de
zlib.compress
:Edições:
@ d0sboots comentadas: Para dados RAW Deflate, você precisa adicionar mais 2 bytes nulos:
→
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"
Este Q on SO fornece mais informações sobre essa abordagem. Uma resposta lá sugere que também há um rodapé de 8 bytes.
Os usuários @ Vitali-Kushner e @ mark-bessey relataram sucesso, mesmo com arquivos truncados, portanto, um rodapé gzip não parece estritamente necessário.
@ tobias-kienzler sugeriu esta função para o bashrc :
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - $@ |gzip -dc)
fonte
O usuário @tino comentou abaixo a resposta do OpenSSL, mas acho que isso deve ser separado:
Eu tentei isso e funcionou para mim.
zlib-flate
pode ser encontrado no pacoteqpdf
(no Debian Squeeze e no Fedora 23, de acordo com os comentários em outras respostas)fonte
zlib-flate
instalado no macOS? Eu não vejo em lugar algum.qpdf
pacote que eu instaleibrew
como mencionado no comentário acima - ou veja a última frase desta resposta :). Além disso,qpdf
é muito legal, então dê uma olhada também se tiver tempo!Eu encontrei uma solução (uma das possíveis), está usando o openssl :
ou
* OBSERVAÇÃO: a funcionalidade zlib está aparentemente disponível nas versões recentes do openssl> = 1.0.0 (o OpenSSL deve ser configurado / construído com a opção zlib ou zlib-dynamic, a última é o padrão)
fonte
zlib-flate
oqpdf
pacote. Pode ser usado comozlib-flate -uncompress < FILE
.Eu recomendo o pigz de Mark Adler , co-autor da biblioteca de compactação zlib. Execute
pigz
para ver os sinalizadores disponíveis.Vais aperceber-te:
-z --zlib Compress to zlib (.zz) instead of gzip format.
Você pode descompactar usando a
-d
bandeira:-d --decompress --uncompress Decompress the compressed input.
Supondo que um arquivo chamado 'teste':
pigz -z test
- cria um arquivo compactado zlib chamado test.zzpigz -d -z test.zz
- converte test.zz no arquivo de teste descompactadoNo OSX você pode executar
brew install pigz
fonte
unpigz test.zz
também funcionará.$>file hello.txt.zz
hello.txt.zz: zlib compressed data
zlib
implementa a compactação usada pelo gzip, mas não o formato do arquivo. Em vez disso, você deve usar ogzip
módulo , que ele próprio usazlib
.fonte
zlib
e recomprimi-losgzip
, se ainda não tiver os dados originais.Isso pode fazer isso:
Em seguida, execute-o assim:
fonte
zlib.decompress
. provavelmente eu usaria alguma função de caminhada. Eu não tenho certeza se shell iria lidar com o meu enorme quantidade de arquivos com wildcard glob :)file
comando shell ? Como é isso?O programa de exemplo
zpipe.c
encontrado aqui pelo próprio Mark Adler (fornecido com a distribuição de origem da biblioteca zlib) é muito útil para esses cenários com dados brutos do zlib. Compilar comcc -o zpipe zpipe.c -lz
e para descomprimir:zpipe -d < raw.zlib > decompressed
. Também pode fazer a compactação sem a-d
bandeira.fonte
No macOS, que é um UNIX completo compatível com POSIX (certificado formalmente!),
OpenSSL
Não házlib
suporte, não házlib-flate
e, embora a primeira solução funcione tão bem quanto todas as soluções Python, a primeira solução exige que os dados ZIP estejam em um arquivo e todas as outras soluções forçam você a criar um script Python.Aqui está uma solução baseada em Perl que pode ser usada como uma linha de comando, obtém sua entrada via STDIN pipe e que funciona imediatamente com um macOS instalado recentemente:
Melhor formatado, o script Perl fica assim:
fonte
Você pode usar isso para compactar com o zlib:
E isso para desinflar:
fonte
unknown option '-z'
no Ubuntu 16.04 eOpenSSL 1.0.2g 1 Mar 2016
funciona para mim no fedora25
fonte
zcat
só funciona com arquivos no formato gzip.