1.GZipStream 类
此类在 .NET Framework 2.0 版中是新增的。
提供用于压缩和解压缩流的方法和属性
2.压缩byte[]
C#代码
class="star" src="/Upload/Images/2014101409/40B102E0EF997EA6.png" alt="收藏代码" />
- public byte[] Compress(byte[] data)
- {
- MemoryStream ms = new MemoryStream();
- GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress);
- zipStream.Write(data, 0, data.Length);
- zipStream.Close();
- return ms.ToArray();
- }
3.解压byte[]
C#代码
- public byte[] Decompress(byte[] data)
- {
- MemoryStream srcMs = new MemoryStream(data);
- GZipStream zipStream = new GZipStream(srcMs, CompressionMode.Decompress);
- MemoryStream ms = new MemoryStream();
- byte[] bytes = new byte[40960];
- int n;
- while ((n = zipStream.Read(bytes, 0, bytes.Length)) > 0)
- {
- ms.Write(bytes, 0, n);
- }
- zipStream.Close();
- return ms.ToArray();
- }
4.压缩byte[]数据,存放到文件中
C#代码
-
-
-
-
- public static void CompressData(byte[] srcBuffer, string destFile)
- {
- FileStream destStream = null;
- GZipStream compressedStream = null;
- try
- {
-
- destStream = new FileStream(destFile, FileMode.OpenOrCreate, FileAccess.Write);
-
- compressedStream = new GZipStream(destStream, CompressionMode.Compress, true);
-
- compressedStream.Write(srcBuffer, 0, srcBuffer.Length);
- }
- catch (Exception ex)
- {
- throw new Exception(String.Format("压缩数据写入文件{0}时发生错误", destFile), ex);
- }
- finally
- {
-
- if (null != compressedStream)
- {
- compressedStream.Close();
- compressedStream.Dispose();
- }
-
- if (null != destStream)
- destStream.Close();
- }
- }
5.解压文件,得到byte[]数据
C#代码
-
-
-
-
- public static byte[] DecompressData(string srcFile)
- {
- if (false == File.Exists(srcFile))
- throw new FileNotFoundException(String.Format("找不到指定的文件{0}", srcFile));
- FileStream sourceStream = null;
- GZipStream decompressedStream = null;
- byte[] quartetBuffer = null;
- try
- {
- sourceStream = new FileStream(srcFile, FileMode.Open, FileAccess.Read, FileShare.Read);
-
- decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);
-
-
-
-
-
-
-
-
-
-
- quartetBuffer = new byte[4];
- long position = sourceStream.Length - 4;
- sourceStream.Position = position;
- sourceStream.Read(quartetBuffer, 0, 4);
-
- int checkLength = BitConverter.ToInt32(quartetBuffer, 0);
- byte[] data;
- if (checkLength <= sourceStream.Length)
- {
- data = new byte[Int16.MaxValue];
- }
- else
- {
- data = new byte[checkLength + 100];
- }
-
- byte[] buffer = new byte[100];
-
- sourceStream.Position = 0;
-
- int offset = 0;
- int total = 0;
-
- while (true)
- {
- int bytesRead = decompressedStream.Read(buffer, 0, 100);
-
- if (bytesRead == 0)
- break;
-
- buffer.CopyTo(data, offset);
-
- offset += bytesRead;
- total += bytesRead;
- }
-
- byte[] actualdata = new byte[total];
-
- for (int i = 0; i < total; i++)
- actualdata[i] = data[i];
-
- return actualdata;
- }
- catch (Exception ex)
- {
- throw new Exception(String.Format("从文件{0}解压数据时发生错误", srcFile), ex);
- }
- finally
- {
- if (sourceStream != null)
- sourceStream.Close();
-
- if (decompressedStream != null)
- decompressedStream.Close();
- }
- }
6.小结
压缩,解压都用GZipStream,操作的对象时普通流MemoryStream,不同的是:
压缩是将btye[]型的数据写入GZipStream中,而解压的时候是将GzipStream中的数据写入到byte[]中,并将读出的数据写入到MemoryStream后一次性输出
压缩到文件与压缩成byte[]不同的是压缩到文件利用到了FileStream将流写到文件,解压Gzip文件,需要根据文件的规则进行:后4位记录未压缩前的长度,根据该长度可以将解压出来的文件存放到稍大的byte[]中