C#压缩和解压缩字节(GZip)
标题:C#压缩和解压缩字节(GZip的使用)
作用:此类在 .NET Framework 2.0 版中是新增的。提供用于压缩和解压缩流的方法和属性。
定义:表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法。这种格式包括一个检测数据损坏的循环冗余校验值。GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但它可以扩展以使用其他压缩格式。这种格式可以通过不涉及专利使用权的方式轻松实现。gzip 的格式可以从 RFC 1952“GZIP file format specification 4.3(GZIP 文件格式规范 4.3)GZIP file format specification 4.3(GZIP 文件格式规范 4.3)”中获得。此类不能用于压缩大于 4 GB 的文件。
下面给出两个具体Demo:
实例1
//压缩字节 //1.创建压缩的数据流 //2.设定compressStream为存放被压缩的文件流,并设定为压缩模式 //3.将需要压缩的字节写到被压缩的文件流 public static byte[] CompressBytes(byte[] bytes) { using(MemoryStream compressStream = new MemoryStream()) { using(var zipStream = new GZipStream(compressStream, CompressMode.ComPress)) zipStream.Write(bytes, 0, bytes.Length); return compressStream.ToArray(); } } //解压缩字节 //1.创建被压缩的数据流 //2.创建zipStream对象,并传入解压的文件流 //3.创建目标流 //4.zipStream拷贝到目标流 //5.返回目标流输出字节 public static byte[] Decompress(byte[] bytes) { using(var compressStream = new MemoryStream(bytes)) { using(var zipStream = new GZipStream(compressStream, CompressMode.DeCompress)) { using(var resultStream = new MemoryStream()) { zipStream.CopyTo(resultStream); return resultStream.ToArray(); } } } }
实例2(摘自MSDN):
class Program { public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) { int offset = 0; int totalCount = 0; while (true) { int bytesRead = stream.Read(buffer, offset, 100); if (bytesRead == 0) { break; } offset += bytesRead; totalCount += bytesRead; } return totalCount; } public static bool CompareData(byte[] buf1, int len1, byte[] buf2, int len2) { if (len1 != len2) { Console.WriteLine("Number of bytes in two buffer are diffreent {0}:{1}", len1, len2); return false; } for (int i = 0; i < len1; i++) { if (buf1[i] != buf2[i]) { Console.WriteLine("byte {0} is different {1}{2}", i, buf1[i], buf2[i]); return false; } } Console.WriteLine("All byte compare true"); return true; } public static void GZipCompressDecompress(string fileName) { Console.WriteLine("Test compresssion and decompression on file {0}", fileName); FileStream infile; try { //Comopress infile = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] buffer = new byte[infile.Length]; int count = infile.Read(buffer, 0, buffer.Length); if (count != buffer.Length) { infile.Close(); infile.Dispose(); Console.WriteLine("Test Failed: Unable to read data from file"); return; } infile.Close(); MemoryStream ms = new MemoryStream(); GZipStream compressGZipStream = new GZipStream(ms, CompressionMode.Compress, true); Console.WriteLine("Compression"); compressGZipStream.Write(buffer, 0, buffer.Length); //从指定字节数组中将压缩的字节写入基础流 compressGZipStream.Close(); Console.WriteLine("Original size:{0}, Compressed size:{1}", buffer.Length, ms.ToArray().Length); //DeCompress ms.Position = 0; GZipStream deCompressGZipStream = new GZipStream(ms, CompressionMode.Decompress); Console.WriteLine("Decompression"); byte[] decompressedBuffer = new byte[buffer.Length + 100]; int totalCount = ReadAllBytesFromStream(deCompressGZipStream, decompressedBuffer); Console.WriteLine("Decompressed {0} bytes", totalCount); if (!CompareData(buffer, buffer.Length, decompressedBuffer, decompressedBuffer.Length)) { Console.WriteLine("Error. The two buffers did not compare."); } deCompressGZipStream.Dispose(); } catch (ArgumentNullException) { Console.WriteLine("ArgumentNullException:{0}", "Error: The path is null."); } catch (ArgumentException) { Console.WriteLine("ArgumentException:{0}", "Error: path is a zero-length string, contains an empty string or one more invlaid characters"); } catch (NotSupportedException) { Console.WriteLine("NotSupportedException:{0}", "Cite no file, such as 'con:'、'com1'、'lpt1' in NTFS"); } catch (FileNotFoundException) { Console.WriteLine("FileNotFoundException:{0]", "Find no file"); } catch (IOException) { Console.WriteLine("IOException:{0}", "Occur I/O error"); } catch (System.Security.SecurityException) { Console.WriteLine("System.Security.SecurityException{0}:", "The calls has no permission"); } catch (UnauthorizedAccessException) { Console.WriteLine("UnauthorizedAccessException:{0}", "path specified a file that is read-only, the path is a directory, " + "or caller does not have the required permissions"); } } static void Main(string[] args) { GZipCompressDecompress(@"D:\config.ini"); } }