为什么我的C# gzip生成的文件比Fiddler或PHP生成的文件大?

5 浏览
0 Comments

为什么我的C# gzip生成的文件比Fiddler或PHP生成的文件大?

如果我使用C#将这段文本进行GZip压缩:

Hello World

使用以下代码:

Stream stream = new MemoryStream(Encoding.Default.GetBytes("Hello World"));
var compressedMemoryStream = new MemoryStream();
using (var gzipStream = new GZipStream(compressedMemoryStream, CompressionMode.Compress))
{
    stream.CopyTo(gzipStream);  
    gzipStream.Close(); 
} 

得到的流长度为133字节。

将相同的字符串通过Fiddler的Utilities.GzipCompress这个PHP页面运行,结果只有31字节。

在这两种情况下,输入都是11字节,所以我想PHP的结果是正确的,但显然这意味着我无法在.NET中解压缩PHP的压缩文件,反之亦然。为什么.NET的输出要大得多?


实际上,事实证明,尽管PHP和Fiddler的结果长度相同,但它们并不相同。我可以在.NET中解压缩PHP版本,但无法解压缩Fiddler版本。PHP页面可以解压缩这三个版本,所以看起来Fiddler和.NET的gzip实现之间可能存在不兼容性。


按要求,我已经将这三个输出上传到了dropbox这里

以下是这些文件的原始十六进制转储(不确定这样是否真的有用,但我认为这显示了Fiddler和PHP版本之间的差异在于头部,而不是压缩数据本身):

Fiddler:

0000-0010:  1f 8b 08 00-c2 e6 ff 4f-00 ff f3 48-cd c9 c9 57  .......O ...H...W
0000-001f:  08 cf 2f ca-49 01 00 56-b1 17 4a 0b-00 00 00     ../.I..V ..J....

PHP:

0000-0010:  1f 8b 08 00-00 00 00 00-00 03 f3 48-cd c9 c9 57  ........ ...H...W
0000-001f:  08 cf 2f ca-49 01 00 56-b1 17 4a 0b-00 00 00     ../.I..V ..J....

C#:

0000-0010: 1f 8b 08 00-00 00 00 00-04 00 ec bd-07 60 1c 49 ........ .....`.I

0000-0020: 96 25 26 2f-6d ca 7b 7f-4a f5 4a d7-e0 74 a1 08 .%&/m.{. J.J..t..

0000-0030: 80 60 13 24-d8 90 40 10-ec c1 88 cd-e6 92 ec 1d .`.$..@. ........

0000-0040: 69 47 23 29-ab 2a 81 ca-65 56 65 5d-66 16 40 cc iG#).*.. eVe]f.@.

0000-0050: ed 9d bc f7-de 7b ef bd-f7 de 7b ef-bd f7 ba 3b .....{.. ..{....;

0000-0060: 9d 4e 27 f7-df ff 3f 5c-66 64 01 6c-f6 ce 4a da .N'...?\ fd.l..J.

0000-0070: c9 9e 21 80-aa c8 1f 3f-7e 7c 1f 3f-22 be 9d 97 ..!....? ~|.?"...

0000-0080: 65 95 7e b7-aa cb d9 ff-13 00 00 ff-ff 56 b1 17 e.~..... .....V..

0000-0085: 4a 0b 00 00-00

0