我运行这个代码
var data = new MemoryStream();
for (int i = 0; i < 1000; i++)
data.Write(Encoding.Unicode.GetBytes("0123456789"), 0, Encoding.Unicode.GetBytes("0123456789").Length);
using (MemoryStream fileStream = new MemoryStream(data.ToArray()))
using (MemoryStream stream = new MemoryStream())
{
using (GZipStream destination = new GZipStream(stream, CompressionMode.Compress, true ))
fileStream.CopyTo(destination);
stream.Seek(0, SeekOrigin.Begin);
var ret = stream.ToArray();
Console.WriteLine(Convert.ToBase64String(ret));
}
在dotnet核心和。NET框架4.5.2。但结果并不平等。
Dotnet Core v3.1
[0] [byte]:31
[1] [byte]:139
[2] [byte]:8
[3] [byte]:0
[4] [byte]:0
[5] [byte]:0
[6] [byte]:0
[7] [byte]:0
[8] [byte]:0
[9] [byte]:10
[10] [byte]:237
[11] [byte]:214
[12] [byte]:177
[13] [byte]:17
[14] [byte]:128
[15] [byte]:48
[16] [byte]:12
[17] [byte]:4
[18] [byte]:193
[19] [byte]:43
[20] [byte]:201
[21] [byte]:96
[22] [byte]:48
[23] [byte]:208
[24] [byte]:127
[25] [byte]:99
[26] [byte]:238
[27] [byte]:130
[28] [byte]:104
[29] [byte]:83
[30] [byte]:133
...
[168] [byte]:32
[169] [byte]:78
[170] [byte]:0
[171] [byte]:0
BAS64:H4sIAAAAAAAACu3WsRGAMAwEwSvJYDDQf2PugmhThT/Sa0dHZ7Oru9XT29cwk4E9cAv6QCf6C34jHzASEzIhEzIh
。NET 4.5.2
[0] [byte]:31
[1] [byte]:139
[2] [byte]:8
[3] [byte]:0
[4] [byte]:0
[5] [byte]:0
[6] [byte]:0
[7] [byte]:0
[8] [byte]:4
[9] [byte]:0
[10] [byte]:237
[11] [byte]:200
[12] [byte]:65
[13] [byte]:1
[14] [byte]:128
[15] [byte]:32
[16] [byte]:0
[17] [byte]:0
[18] [byte]:177
[19] [byte]:139
[20] [byte]:132
[21] [byte]:162
[22] [byte]:168
[23] [byte]:253
[24] [byte]:139
[25] [byte]:209
[26] [byte]:194
[27] [byte]:215
[28] [byte]:246
[29] [byte]:220
[30] [byte]:232
...
[95] [byte]:32
[96] [byte]:78
[97] [byte]:0
[98] [byte]:0
BASE64:H4sIAAAAAAAEAO3IQGAIAAsYuEoqj9i9HC1/bc6OhsdnW3enr7Gs4555xzzjnnnHPOOeecc84555xzzjnnn HPOOeeec84555xzjnnnHPooeecc845536/De9l0rMgTgAA
为什么字节8和9有这样的差异?
GZIP有自己的头,这些字节属于它。
gzip头中的偏移量8和9是两个字节,用于存储额外的标志和操作系统类型。
deflate,4的额外标志意味着压缩器使用了快速算法(或低压缩。2是最大压缩/慢速(。这只是一个信息,它不会改变你解压缩deflate的方式。
对于OS类型;10〃;是TOPS-20;0";是FAT文件系统。不确定MS为什么使用这个值,我认为例如zlib默认为255("未知"(。我不相信这个领域有任何实际用途。
因此,只是头中的一个信息更改,它可能来自于更改实现,或者传递给它的参数
之后。NET 4.5,他们将GZipStream的实现从本机实现更改为托管实现。你看到的差异可能与此有关。
来源。
看起来你可以强迫。NET使用本机实现,使用兼容开关CCD_ 1。
也就是说,GZip不能保证两个实现在压缩相同的数据时会产生完全相同的字节。你不应该依赖这个。