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 }