c# 解凍 GZipStreamマシン依存




vba gz 解凍 (4)

私は、.NET 4.0でいくつかの奇妙なマシン/ OS依存のGZipStream動作に陥っています。 これは関連するコードです:

public static string Compress(string input) {
    using(var ms = new MemoryStream(Encoding.UTF8.GetBytes(input)))
    using(var os = new MemoryStream()) {
        using(var gz = new GZipStream(os,CompressionMode.Compress,true)) {
            ms.CopyTo(gz);
        }
        return string.Join("",os.ToArray().Select(b=>b.ToString("X2")));
    }
}

Compress( "フリーク")を実行すると私に与えられます

1F8B08000000000004004B2B4A4DCD06001E33909D05000000

Windows 7および

1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22CEEB3C7FFBFF040000FFFF1E33909D05000000

Windows Server 2008 R2の場合 どちらも64ビットです。 結果は同じであると私は期待しています。

いずれの結果も解凍すると、両方のマシンで正しい結果が得られます。 私はすでにW7のms.Length == 25でW2K8R2のms.Length == 128の間にそれを見つけましたが、理由はありません。

どうしたの?


.NET 4.5 Betaには、サイズを縮小するためのZip圧縮の改善が含まれていることが発表されました

.NET Framework 4.5 RC以降、DeflateStreamクラスは圧縮にzlibライブラリを使用します。 その結果、より良い圧縮アルゴリズムと、ほとんどの場合、以前のバージョンの.NET Frameworkで提供されていたよりも圧縮されたファイルが小さくなります。

Win7マシンに.NET 4.5以上がインストールされていますか?


Abelのanswerとは対照的に、私は

1F8B08000000000004004B2B4A4DCD06001E33909D05000000

私のWindows 7 x64 Ultimate SP1で。 おそらく、あなたはボックスの1つにない.NET Frameworkのアップデートがありますか? 私のmscorlib.dllのバージョンは4.0.30319.17379です。

ETA: .NET 2にリターゲティングして(そして.NET 4固有の構造を.NET 2に相当するものに変更する)、私は

1F8B0800000000000400EDBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22CEEB3C7FFBFF001E33909D05000000

同じマシン/ OS上に存在します。


Windows 7の64ビットマシンでコードを実行し、Win2k8SP2に等しい以下のコードを取得しました。

1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F229ED579FEF6FF090000FFFF1A1C515C05000000

本質的には、結果は機械の語長と関係していると思います。 つまり、あなたのWindows-7マシンはおそらく32ビットでしょうか?

注:私はあなたのストリングのために少し解凍を書いた、そして私は彼らが実際によく解凍することを第二にしなければならない。 私は32ビットと64ビットの両方で私のバージョンを走らせて、結果は同等でした。 可能な違いは残っています:異なるランタイムですか?

編集:

別のランタイムですか?

明らかに、 Henk Holtermanが以下に示唆し、 が彼の答えで公式化したように 、これは確かにここでは明らかではないケースでした。


.NET 4.5のDeflateStreamで使用されるアルゴリズムに変更があるようです:

DeflateStreamクラスは、.NET Framework 4.5 Betaからzlibライブラリを使用して圧縮します。 その結果、より良い圧縮アルゴリズムと、ほとんどの場合、以前のバージョンの.NET Frameworkで提供されていたよりも圧縮されたファイルが小さくなります。

私は4.5をインストールしていたので、これは問題を引き起こしていました。





gzipstream