it-swarm-ko.tech

UNIX에서 zlib 데이터를 압축 해제하는 방법은 무엇입니까?

파이썬에서 zlib 압축 데이터를 다음과 같이 만들었습니다.

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

(또는 Shell의 한 줄짜리 : echo -n '...' | python2 -c 'import sys,zlib; sys.stdout.write(zlib.compress(sys.stdin.read()))' > /tmp/data)

이제 Shell의 데이터를 압축 해제하고 싶습니다. 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 패키지에는 실행 가능한 유틸리티가 없습니다.

원시 zlib 데이터를 압축 해제하는 유틸리티가 있습니까?

121
mykhal

표준 Shell-script + gzip 을 사용하여 압축을 풀거나 openssl 또는 도구.
트릭은 gzip magic number and compress methodzlib.compress의 실제 데이터 앞에 추가하는 것입니다.

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

편집 :
@ d0sboots 댓글 : RAW Deflate 데이터의 경우 널 바이트를 2 개 더 추가해야합니다.
"\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00"

이 Q on SO 이 방법에 대한 자세한 정보를 제공합니다. 거기에 대한 대답은 8 바이트 바닥 글도 있음을 나타냅니다.

@ Vitali-Kushner 및 @ mark-bessey 사용자는 잘린 파일로도 성공했다고보고 했으므로 gzip 바닥 글이 반드시 필요한 것은 아닙니다.

@ tobias-kienzler는 bashrc 에 대해이 함수를 제안했습니다.
zlipd() (printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - [email protected] |gzip -dc)

146
wkpark
zlib-flate -uncompress < FILE

나는 이것을 시도했고 그것은 나를 위해 일했다.

zlib-flateqpdf 패키지에서 찾을 수 있습니다 (다른 답변의 의견에 따르면 Debian Squeeze 및 Fedora 23에서)

(OpenSSL 답변 아래에 의견을 제공 한 @tino 사용자에게 감사합니다. 쉽게 액세스 할 수 있도록 적절한 답변을 만들었습니다.)

81
Catskul

해결책 (가능한 것 중 하나)을 찾았습니다 .openssl

$ openssl zlib -d < /tmp/data

또는

$ openssl zlib -d -in /tmp/data

* 참고 : zlib 기능은 최근 openssl 버전> = 1.0.0에서 사용 가능합니다 (OpenSSL은 zlib 또는 zlib-dynamic 옵션으로 구성/빌드해야합니다. 후자는 기본값입니다)

63
mykhal

Zlib 압축 라이브러리의 공동 저자 인 Mark Adlerpigz 를 추천합니다. 사용 가능한 플래그를 보려면 pigz를 실행하십시오.

당신은 알 것이다 :

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

-d 깃발:

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

'test'라는 파일을 가정하면 :

  • pigz -z test-test.zz라는 zlib 압축 파일을 만듭니다.
  • pigz -d -z test.zz-test.zz를 압축 해제 된 테스트 파일로 변환

OSX에서는 brew install pigz

30
snodnipper

zlib 파일 형식이 아닌 gzip에서 사용하는 압축을 구현합니다. 대신 gzip를 사용하는 zlib module 을 사용해야합니다.

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

이것은 할 수 있습니다 :

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/*
3
Jeremy Banks

전체 POSIX 호환 UNIX (공식적으로 인증 됨) 인 macOS에서 OpenSSL에는 zlib 지원이 없으며 zlib-flate도 없으며 첫 번째 솔루션도 작동합니다. 모든 Python 솔루션과 마찬가지로 첫 번째 솔루션에는 Zip 데이터가 파일에 있어야하며 다른 모든 솔루션에서는 Python 스크립트를 작성해야합니다.

다음은 명령 줄 원 라이너로 사용할 수 있고 STDIN 파이프를 통해 입력을 받고 새로 설치된 macOS를 통해 즉시 사용할 수있는 Perl 기반 솔루션입니다.

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

더 좋은 형식의 Perl 스크립트는 다음과 같습니다.

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

Mark Adler가 직접 작성한 예제 프로그램 zpipe.cfound here (zlib 라이브러리의 소스 배포와 함께 제공)은 원시 zlib 데이터가있는 이러한 시나리오에 매우 유용합니다. cc -o zpipe zpipe.c -lz로 컴파일하고 zpipe -d < raw.zlib > decompressed의 압축을 푸십시오. -d 플래그없이 압축을 수행 할 수도 있습니다.

3
Henno Brandsma

이것을 사용하여 zlib로 압축 할 수 있습니다.

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

그리고 이것은 수축합니다.

openssl enc -z -none -d < /file/to/deflate
1
Danny R

EIDAS 관련 코드를 개발하는 동안 나는 일반적으로 base64 및 raw-deflate (php gzdeflate)에 의해 인코딩되는 SSO (SingleSignOn) SAMLRequest 매개 변수를 디코딩하는 bash 스크립트를 생각해 냈습니다.

#!/bin/bash
# file decode_saml_request.sh

urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }

if [[ $contents == *"SAMLRequest" ]]; then
  # extract param SAMLRequest from URL, strip all following params
  contents=$(cat ${1} | awk -F 'SAMLRequest=' '{print $2}' | awk -F '&' '{print $1}')
else
  # work with raw base64 encoded string
  contents=$(cat ${1})
fi

# add gzip raw-deflate header bytes and gunzip (`gzip -dc` can be replaced by `gunzip`)
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00" | cat - <(echo `urldecode $contents` | base64 -d) | gzip -dc

당신은 그것을 사용할 수 있습니다

> decode_saml_request.sh /path/to/file_with_sso_url
# or
> echo "y00tLk5MT1VISSxJBAA%3D" | decode_saml_request.sh

스크립트는 여기에 요점으로도 게시됩니다 : https://Gist.github.com/smarek/77dacb9703ac8b715b5eced5314d5085 그래서 나는이 답변을 유지할 수는 없지만 소스 요점을 유지합니다

0
Marek Sebera