GZipStream机器依赖

时间:2012-03-21 14:14:36

标签: c# .net .net-4.5 gzipstream

我在.NET 4.0中遇到了一些奇怪的机器/操作系统相关的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")));
    }
}

运行压缩(“freek”)给了我

1F8B08000000000004004B2B4A4DCD06001E33909D05000000
Windows 7上的

1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22CEEB3C7FFBFF040000FFFF1E33909D05000000
Windows Server 2008R2上的

。两者都是64位。我希望结果是一样的。

当我解压缩任何一个结果时,两台机器都会给出正确的结果。我已经发现在W7 ms.Length == 25而在W2K8R2 ms.Length == 128,但没有线索为什么。

发生了什么事?

5 个答案:

答案 0 :(得分:18)

It was announced that .NET 4.5 Beta includes zip compression improvements to reduce the size

  

从.NET Framework 4.5 RC开始,DeflateStream类使用zlib库进行压缩。因此,它提供了更好的压缩算法,并且在大多数情况下,它提供的压缩文件比早期版本的.NET Framework中提供的压缩文件小。

你可能在Win7机器上安装了.Net 4.5+吗?

答案 1 :(得分:5)

algorithm used by DeflateStream in .NET 4.5似乎发生了变化:

  

从.NET Framework 4.5 Beta开始,DeflateStream类使用zlib库进行压缩。因此,它提供了更好的压缩算法,并且在大多数情况下,它提供的压缩文件比早期版本的.NET Framework中提供的压缩文件小。

由于我安装了4.5,这导致了问题。

答案 2 :(得分:1)

我在Windows 7 64位计算机上运行了您的代码并获得了以下内容,这相当于您的Win2k8SP2:

1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F229ED579FEF6FF090000FFFF1A1C515C05000000

基本上,我认为结果与机器的字长有关。即,你的windows-7机器可能是32位?

注意:我为你的字符串写了一点解压缩,我不得不说它们确实解压得很好。我在32位和64位运行我的版本,结果是相同的。只剩下可能的差异:不同的运行时间?

编辑:

  

不同的运行时间?

显然,正如Henk HoltermanRobert Levy中提出的his answer和{{3}}中正式确定的那样,这确实是非显而易见的案例。

答案 3 :(得分:1)

Abelanswer相反,我得到了

的结果
1F8B08000000000004004B2B4A4DCD06001E33909D05000000

在我的Windows 7 x64 Ultimate SP1上。也许在其中一个框中没有.NET Framework更新?我的mscorlib.dll的版本是4.0.30319.17379。

ETA:如果我重新定位到.NET 2(并将.NET 4特定的结构更改为其.NET 2等效项),我会得到

的结果
1F8B0800000000000400EDBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22CEEB3C7FFBFF001E33909D05000000

在同一台机器/操作系统上。

答案 4 :(得分:0)

我怀疑其中一个操作系统是32位,另一个是64位。