84

DEFLATEアルゴリズムのコマンドラインラッパーを探しています。

DEFLATEを使用して圧縮されたファイル(git blob)があり、それを解凍したいと思います。gzipコマンドには、gzip形式ではなく、DEFLATEアルゴリズムを直接使用するオプションがないようです。

理想的には、これを実行できる標準のUnix/Linuxツールを探しています。

編集:これは私の問題にgzipを使おうとしたときに得られる出力です:

$ cat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip

gzip: stdin: not in gzip format
4

21 に答える 21

53

次のようなものは、「$ type $ length\0」ヘッダーを含む生のコンテンツを出力します。

perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' \
     < .git/objects/27/de0a1dd5a89a94990618632967a1c86a82d577
于 2010-07-06T10:17:37.033 に答える
49

これは、OpenSSLコマンドラインツールを使用して実行できます。

openssl zlib -d < $IN > $OUT

残念ながら、少なくともUbuntuでは、zlibサブコマンドはデフォルトのビルド構成()で無効になっているため、使用するにはソースから--no-zlib --no-zlib-dynamicコンパイルする必要があります。opensslただし、たとえばArchではデフォルトで有効になっています。

編集:zlibコマンドはArchでもサポートされなくなったようです。この答えはもう役に立たないかもしれません:(

于 2013-12-20T22:09:30.220 に答える
39

pythonicワンライナー:

$> python -c "import zlib,sys;print \
           repr(zlib.decompress(sys.stdin.read()))" < $IN
于 2011-11-30T12:34:39.423 に答える
29

更新: Mark Adlerは、git blobは生のDEFLATEストリームではなく、zlibストリームであると述べました。pigzこれらは、いくつかのLinuxディストリビューションにあらかじめパッケージ化されているツールで解凍できます。

$ cat foo.txt 
file foo.txt!

$ git ls-files -s foo.txt
100644 7a79fc625cac65001fb127f468847ab93b5f8b19 0   foo.txt

$ pigz -d < .git/objects/7a/79fc625cac65001fb127f468847ab93b5f8b19 
blob 14file foo.txt!

kriegaexによる編集: Windowsユーザー向けのGit Bashは、pigzがデフォルトで使用できないことに気付くでしょう。プリコンパイルされた32/64ビットバージョンはここにあります。64ビットバージョンを試しましたが、うまく機能します。たとえば、 pigz.exeを直接コピーc:\Program Files\Git\usr\binして、パスに配置することができます。


私の最初の答えは、歴史的な理由で保持されています:

Marc van Kempenが言及したウィキペディアの記事のヒントを理解していれば、 zlibpuff.cから直接使用できます。

これは小さな例です:

#include <assert.h>
#include <string.h>
#include "puff.h"

int main( int argc, char **argv ) {
    unsigned char dest[ 5 ];
    unsigned long destlen = 4;
    const unsigned char *source = "\x4B\x2C\x4E\x49\x03\x00";
    unsigned long sourcelen = 6;    
    assert( puff( dest, &destlen, source, &sourcelen ) == 0 );
    dest[ 4 ] = '\0';
    assert( strcmp( dest, "asdf" ) == 0 );
}
于 2010-07-05T10:08:21.013 に答える
28

次のように、zlib-flateを使用できます。

cat .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 \
    | zlib-flate -uncompress; echo

私のマシンにはデフォルトでありqpdf - tools for and transforming and inspecting PDF filesますが、インストールする必要がある場合の一部です。

echoコマンドの最後にをポップしました。そのように出力を読む方が簡単だからです。

于 2013-10-09T14:51:15.883 に答える
24

次のコマンドを試してください。

printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7 | gunzip

外部ツールは必要ありません。

出典:UNIXでzlibデータを解凍する方法は?unixSEで

于 2015-02-26T21:39:16.253 に答える
14

これがRubyのワンライナーです(最初にcd .git /を実行し、任意のオブジェクトへのパスを識別します)。

ruby -rzlib -e 'print Zlib::Inflate.new.inflate(STDIN.read)' < ./74/c757240ec596063af8cd273ebd9f67073e1208
于 2011-12-28T21:13:12.987 に答える
12

私はこれに対する良い解決策がないことにうんざりしていたので、NPMに何かを置きました:

https://github.com/jezell/zlibber

これで、パイプを使って膨張/収縮コマンドを実行できます。

于 2013-08-04T02:29:26.943 に答える
9

Pythonでコミットオブジェクトを壊して開く例を次に示します。

$ git show
commit 0972d7651ff85bedf464fba868c2ef434543916a
# all the junk in my commit...
$ python
>>> import zlib
>>> file = open(".git/objects/09/72d7651ff85bedf464fba868c2ef434543916a")
>>> data = file.read()
>>> print data
# binary garbage
>>> unzipped_data = zlib.decompress(data)
>>> print unzipped_data
# all the junk in my commit!

コマンドがヘッダーを出力しないことを除いて、「git cat-file -p [hash]」の出力とほぼ同じです(「commit」の後にコンテンツのサイズとヌルバイトが続きます)。

于 2011-06-30T18:01:12.217 に答える
8

gitオブジェクトは、zlibではなくによって圧縮されるgzipため、を使用zlibして解凍するか、gitコマンドを使用してgit cat-file -p <SHA1>コンテンツを印刷します。

于 2013-01-09T03:35:55.290 に答える
8

Mark Adlerが私たちを念頭に置いており、これを行う方法の例を次のように書いているようです:http ://www.zlib.net/zpipe.c

それgcc -lzは、zlibヘッダーがインストールされているだけでコンパイルされます。/usr/local/bin/zpipegitのものを操作しているときに、結果のバイナリを自分にコピーしました。

于 2013-06-04T14:26:45.730 に答える
6
// save this as deflate.go

package main

import (
    "compress/zlib"
    "io"
    "os"
    "flag"
)

var infile = flag.String("f", "", "infile")

func main() {
    flag.Parse()
    file, _ := os.Open(*infile)

    r, err := zlib.NewReader(file)
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, r)

    r.Close()
}

$ go build deflate.go
$ ./deflate -f .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7
于 2016-02-01T09:54:56.163 に答える
2

pigzはそれを行うことができます:

apt-get install pigz
unpigz -c .git/objects/c0/fb67ab3fda7909000da003f4b2ce50a53f43e7
于 2017-05-15T20:35:01.517 に答える
2

gitオブジェクトはzlibストリームです(生のdeflateではありません)。pigzは、オプションを使用してそれらを解凍し-dzます。

于 2017-11-05T15:37:58.503 に答える
1

http://en.wikipedia.org/wiki/DEFLATE#Encoder_implementationsを参照してください

それはgzipを含む多くのソフトウェア実装をリストしているので、それはうまくいくはずです。ファイルに対してgzipを実行してみましたか?フォーマットを自動的に認識しませんか?

DEFLATEを使用して圧縮されていることをどのように知っていますか?ファイルを圧縮するために使用されたツールは何ですか?

于 2010-07-05T10:01:22.747 に答える
1

gitのツールを使ってデータにアクセスしてみませんか?これにより、任意のgitオブジェクトを読み取ることができるはずです。

git show --pretty=raw <object SHA-1>
于 2010-07-05T10:22:47.213 に答える
1

この質問は、インストールしたばかりの新しいバージョンのクライアントの-textユーティリティのバグの回避策を探しているのを見つけました。ユーティリティはのようhadoop dfsに機能しますが、読み取られるファイルが圧縮されている場合は、透過的に解凍してプレーンテキスト(名前の由来)を出力します。-textcat

すでに投稿されている回答は間違いなく役に立ちましたが、Hadoopサイズのデータ​​を処理するときに、解凍する前にすべてをメモリに読み込むという1つの問題があります。

だから、ここにその制限がない上記のPerlと答えの私のバリエーションがあります:Python

Python:

hadoop fs -cat /path/to/example.deflate |
  python -c 'import zlib,sys;map(lambda b:sys.stdout.write(zlib.decompress(b)),iter(lambda:sys.stdin.read(4096),""))'

Perl:

hadoop fs -cat /path/to/example.deflate |
  perl -MCompress::Zlib -e 'print uncompress($buf) while sysread(STDIN,$buf,4096)'

-catの代わりにサブコマンドを使用していることに注意してください-text。これは、バグを修正した後、回避策が壊れないようにするためです。Pythonバージョンの読みやすさについてお詫びします。

于 2014-05-13T16:22:43.877 に答える
1

コレクションに追加するために、ここにdeflate / inflate / raw deflate /rawinflateのperlワンライナーがあります。

収縮する

perl -MIO::Compress::Deflate -e 'undef $/; my ($in, $out) = (<>, undef); IO::Compress::Deflate::deflate(\$in, \$out); print $out;'

膨らませる

perl -MIO::Uncompress::Inflate -e 'undef $/; my ($in, $out) = (<>, undef); IO::Uncompress::Inflate::inflate(\$in, \$out); print $out;'

生の収縮

perl -MIO::Compress::RawDeflate -e 'undef $/; my ($in, $out) = (<>, undef); IO::Compress::RawDeflate::rawdeflate(\$in, \$out); print $out;'

生の膨らみ

perl -MIO::Uncompress::RawInflate -e 'undef $/; my ($in, $out) = (<>, undef); IO::Uncompress::RawInflate::rawinflate(\$in, \$out); print $out;'
于 2019-05-29T08:59:27.347 に答える
1

私はこの問題に繰り返し遭遇しましたが、インターネット上のほとんどすべての回答が間違っているか、理想的とは言えないコードをコンパイルする必要があるか、システムによって追跡されていない多数の依存関係をダウンロードする必要があるようです!しかし、私は本当の解決策を見つけました。PERLはほとんどのシステムですぐに利用できるため、PERLを使用します。

Bashに似たシェルから:

perl -mIO::Uncompress::RawInflate=rawinflate -erawinflate'"-","-"'

または、手動でexec / forkを実行している場合(シェル引用符は使用しないが、行を区切る):

  • perl
  • -mIO::Uncompress::RawInflate=rawinflate
  • -erawinflate"-","-"

大きな警告:ストリームが有効なDEFLATEストリーム(たとえば、非圧縮データなど)として開始されない場合、このコマンドはすべてのデータをそのままパイプで処理します。ストリームが有効なDEFLATEストリームとして開始された場合にのみ(有効な辞書があると思いますか?よくわかりません...)、このコマンドは何らかの理由でエラーになります。ただし、状況によってはこれが望ましい場合があります。

これがいつでも旅行者に役立つことを願っています。

参照:

PERL IO :: Uncompress :: RawInflate :: rawinflate

于 2021-11-03T19:00:57.310 に答える
0
const zlib = require("zlib");
const adler32 = require("adler32");
const data = "hello world~!";
const chksum = adler32.sum(new Buffer(data)).toString(16);
console.log("789c",zlib.deflateRawSync(data).toString("hex"),chksum);
// or
console.log(zlib.deflateSync(data).toString("hex"));
于 2017-11-04T18:54:14.277 に答える
0

これが私がPowershellで行う方法です。

$fs = New-Object IO.FileStream((Resolve-Path $Path), [IO.FileMode]::Open, [IO.FileAccess]::Read)
$fs.Position = 2
$cs = New-Object IO.Compression.DeflateStream($fs, [IO.Compression.CompressionMode]::Decompress)
$sr = New-Object IO.StreamReader($cs)
$sr.ReadToEnd()

次に、次のようなエイリアスを作成できます。

function func_deflate{
    param(
        [Parameter(Mandatory=$true, ValueFromPipeline = $true)]
        [ValidateScript({Test-Path $_ -PathType leaf})]
        [string]$Path
    )
    $ErrorActionPreference = 'Stop'    
    $fs = New-Object IO.FileStream((Resolve-Path $Path), [IO.FileMode]::Open, [IO.FileAccess]::Read)
    $fs.Position = 2
    $cs = New-Object IO.Compression.DeflateStream($fs, [IO.Compression.CompressionMode]::Decompress)
    $sr = New-Object IO.StreamReader($cs)
    return $sr.ReadToEnd()
}

Set-Alias -Name deflate -Value func_deflate

ここに画像の説明を入力してください

于 2021-11-14T04:48:19.047 に答える