2012-02-07 16 views
0

可能性の重複:
Deflate command line toolPHPの 'gzuncompress'関数はシェル内にありますか?

はい、私はシェル上でPHP自体を使用することができます知っているが、私はPHPが利用可能になる前に展開されているスクリプトでこの機能が必要。

私はgzipunzipを試しましたが、私のパラメータが間違っているか、まったく同じ圧縮を使用していません。

私はこれをbashスクリプトで使いたいと思います。より高いレベルのスクリプト言語に進むことは選択肢ではありません。


私はテスト目的のために、以下のPHPスクリプトを書きました:

#!/usr/bin/php 
<? 
    $contents = file_get_contents($argv[1]); 
    $data = gzuncompress($contents); 
    echo substr($data, 0, 20) . "\n"; 
?> 

これは私が(復号化データの先頭に)期待するものを出力します。私はgunzipに同じファイルを渡すと

$ gunzip -c data 
gzip: data: not in gzip format 

は私がunzipしようとした場合:提案、および他の実用的な方法が存在しないことを考えると

$ unzip data 
Archive: data 
    End-of-central-directory signature not found. Either this file is not 
    a zipfile, or it constitutes one disk of a multi-part archive. In the 
    latter case the central directory and zipfile comment will be found on 
    the last disk(s) of this archive. 
unzip: cannot find zipfile directory in one of data2 or 
     data2.zip, and cannot find data2.ZIP, period. 

、私が行ってきましたrelated questionに提示された解決策で。
しかし、私は他のスクリプト言語への移動(および他の依存関係を導入する)避けたかったことを考えると、私はそれらのすべてと一緒に行きました:

_uncompressedData= 
if hash perl 2>&-; then 
    echo "Using Perl for decompression..." >&2 
    _uncompressedData=$(perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < compressed.bin || true) 
elif hash ruby 2>&-; then 
    echo "Using Ruby for decompression..." >&2 
    _uncompressedData=$(ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < compressed.bin || true) 
elif hash php 2>&-; then 
    echo "Using PHP for decompression..." >&2 
    _uncompressedData=$(php -r "echo gzuncompress(file_get_contents('php://stdin'));" < compressed.bin || true) 
elif hash python 2>&-; then 
    echo "Using Python for decompression..." >&2 
    _uncompressedData=$(python -c "import zlib,sys;print zlib.decompress(sys.stdin.read())" < compressed.bin || true) 
else 
    echo "Unable to find decompressor!" >&2 
    exit 1 
fi 

これらの4つのバージョンは私のテストケースとまったく同じ出力を生成します。

+1

どのようにgzipを使用しますか? 'gzip -c/etc/motd |を試してみてください。ガンジー-c | diff/etc/motd -' – yarek

+0

皮肉なことに、* gzip *と* zipは全く同じアルゴリズムを使用します。彼らはちょうど生データよりも多くを持っている。 –

答えて

6

gzuncompressが期待する形式は、gzipヘッダーのない生のzlib形式です。これは、zlibライブラリのC APIを使用する場合にデフォルトで取得する形式です。

zpipeコマンドラインユーティリティを使用してこの形式を解凍することができます。このユーティリティのソースコードは、zlibソースコード配布のexamples/zpipe.cにあります。しかし、このプログラムはデフォルトでコンパイルされインストールされません。生のzlib形式を受け入れる広く配備されたコマンドラインユーティリティはありません。

あなたはPHPからではなく(とgzip & gunzip取引優しいヘッダと1)をgzipフォーマットを使用したい場合、あなたは代わりにgzcompress & gzuncompressgzencode & gzdecodeを使用する必要があります。

+0

悲しいことに、私は圧縮されたデータを制御しません。 –

+1

それから、あなたはそれがオプションではないと言っていましたが、 'zpipe'のようなユーティリティをバンドルすることや、解凍を行うためにスクリプト言語の1つを使うことを検討する必要があります。 [Ignacio Vazquez-Abrams]([http://stackoverflow.com/questions/3178566/deflate-command-line-tool)]にリンクされた[Deflateコマンドラインツール](http://stackoverflow.com/users/20862/ignacio-vazquez-abrams)は、Python、Ruby、Perlのためのメソッドを提案します。さらにPHPでそれを行う方法も知っています。 – Celada

+0

+1:非常に完全な答えです。 – hakre

関連する問題