GZip压缩之间的差异.Net和dotnet Core



我运行这个代码

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不能保证两个实现在压缩相同的数据时会产生完全相同的字节。你不应该依赖这个。

最新更新