GZipStream 压缩之后的内容不能正常解压得到原文件内容

c# 调用 GZipStream 生成的字节数组,不能再次解压还原成原始文件内容

压缩代码:

1、使用内存流:得到错误的压缩数据

1         public static void Compress1(byte[] bys)
2         {
3             using (MemoryStream dst = new MemoryStream())
4             using (GZipStream gzip = new GZipStream(dst, CompressionMode.Compress))
5             {
6                 gzip.Write(bys, 0, bys.Length);
7                 byte[] byDst = dst.ToArray();  // 压缩后内容长度: 36040996,解压错误
8             }
9         }

2、使用文件流:写入文件,则可得到正确的压缩数据

1         public static void Compress2(byte[] bys)
2         {
3             using (FileStream dst = new FileStream("test.dat", FileMode.Create))
4             using (GZipStream gzip = new GZipStream(dst, CompressionMode.Compress))
5             {
6                 gzip.Write(bys, 0, bys.Length);
7             }
8             // 压缩后文件内容长度:36047743,解压正确
9         }

3、通过 ILSpy 调试,发现 GZipStream 在释放时,还会对内置压缩对象作一些清理工作,并重置文件尾数据,如下图所示

36040996+6739+8 = 36047743,正好等于压缩后文件内容;既然要释放之后读取才正常,那调整下代码,把代码放在翻译之后即可

4、释放后读取压缩数据

 1         public static void Compress3(byte[] bys)
 2         {
 3             using (MemoryStream dst = new MemoryStream())
 4             {
 5                 using (GZipStream gzip = new GZipStream(dst, CompressionMode.Compress))
 6                 {
 7                     gzip.Write(bys, 0, bys.Length);
 8                 }
 9                 byte[] byDst = dst.ToArray();  // 压缩后内容长度: 36047743,解压正确
10             }
11         }

 

posted @ 2021-03-05 13:46  兴龙在线  阅读(704)  评论(0编辑  收藏  举报