C#编程总结(十三)数据压缩2014-03-20 cnblogs 停留的风在进行文件存储或者数据传输时,为了节省空间流量,需要对数据或文件进行压缩。在这里我们讲述 通过C#实现数据压缩。一、GZipStream压缩微软提供用于压缩和解压缩流的方法。此类表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法。 这种格式包括一个检测 数据损坏的循环冗余校验值。 GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但它可以扩 展以使用其他压缩格式。 这种格式可以通过不涉及专利使用权的方式轻松实现。可以使用许多常见的压缩工具对写入到扩展名为 .gz 的文件的压缩 GZipStream 对象进行解压缩; 但是,此类原本并不提供用于向 .zip 存档中添加文件或从 .zip 存档中提取文件的功能。DeflateStream 和 GZipStream 中的压缩功能作为流公开。 由于数据是以逐字节的方式读取的,因 此无法通过进行多次传递来确定压缩整个文件或大型数据块的最佳方法。 对于未压缩的数据源,最好使 用 DeflateStream 和 GZipStream 类。 如果源数据已压缩,则使用这些类时实际上可能会增加流的大 小。具体实现源码1、压缩字节数组
/// <summary>/// 压缩字节数组/// </summary>/// <param name="str"></param>public static byte[] Compress(byte[] inputBytes){using (MemoryStream outStream = new MemoryStream()){using (GZipStream zipStream = new GZipStream(outStream, CompressionMode.Compress, true)){zipStream.Write(inputBytes, 0, inputBytes.Length);zipStream.Close(); //很重要,必须关闭,否则无法正确解压return outStream.ToArray();}}}/// <summary>/// 解压缩字节数组/// </summary>/// <param name="str"></param>public static byte[] Decompress(byte[] inputBytes){using (MemoryStream inputStream = new MemoryStream(inputBytes)){using (MemoryStream outStream = new MemoryStream()){using (GZipStream zipStream = new GZipStream(inputStream, CompressionMode.Decompress)){zipStream.CopyTo(outStream);zipStream.Close();return outStream.ToArray();}}}}
2、压缩字符串在压缩字节的基础扩展而来,注意字符转换,保证不出现乱码。具体原理,这里不再介绍,可见:C#编程总结(十)字符转码 http://www.cnblogs.com/yank/p/3536863.html
/// <summary>/// 压缩字符串/// </summary>/// <param name="input"></param>/// <returns></returns>public static string Compress(string input){byte[] inputBytes = Encoding.Default.GetBytes(input);byte[] result = Compress(inputBytes);return Convert.ToBase64String(result);}/// <summary>/// 解压缩字符串/// </summary>/// <param name="input"></param>/// <returns></returns>public static string Decompress(string input){byte[] inputBytes = Convert.FromBase64String(input);byte[] depressBytes = Decompress(inputBytes);return Encoding.Default.GetString(depressBytes);}