15

我在 .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")));
    }
}

运行 Compress("freek") 给了我

1F8B08000000000004004B2B4A4DCD06001E33909D05000000

在 Windows 7 和

1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22CEEB3C7FFBFF040000FFFF1E33909D05000000

在 Windows Server 2008R2 上。两者都是64位。我希望结果是一样的。

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

这是怎么回事?

4

5 回答 5

18

宣布 .NET 4.5 Beta 包括 zip 压缩改进以减小大小

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

您是否在 Win7 机器上安装了 .Net 4.5+?

于 2012-03-21T15:42:42.793 回答
5

DeflateStream 在 .NET 4.5 中使用的算法似乎发生了变化:

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

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

于 2012-03-21T15:57:28.530 回答
1

Abel回答相反,我得到的结果是

1F8B08000000000004004B2B4A4DCD06001E33909D05000000

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

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

1F8B0800000000000400EDBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F22CEEB3C7FFBFF001E33909D05000000

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

于 2012-03-21T15:06:08.863 回答
1

我在我的 Windows 7 64 位机器上运行了你的代码,得到了以下结果,它等于你的 Win2k8SP2:

1F8B0800000000000400ECBD07601C499625262F6DCA7B7F4AF54AD7E074A10880601324D8904010ECC188CDE692EC1D69472329AB2A81CA6556655D661640CCED9DBCF7DE7BEFBDF7DE7BEFBDF7BA3B9D4E27F7DFFF3F5C6664016CF6CE4ADAC99E2180AAC81F3F7E7C1F3F229ED579FEF6FF090000FFFF1A1C515C05000000

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

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

编辑:

不同的运行时间?

显然,正如Henk Holterman在下面提出的和Robert Levy在他的回答中正式提出的那样,这确实是这里不明显的情况。

于 2012-03-21T14:23:47.357 回答
0

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

于 2012-03-21T14:21:32.873 回答