主要功能是可以用来减轻网络数据的传输数据量,
using System;using System.Collections.Generic;using System.Collections;using System.Text;using System.IO;using System.IO.Compression;
namespace CompressionService{ public class Compression {
//压缩 public int Compress(byte[] source, ref byte[] dest) { int resultcode; try { MemoryStream ms = new MemoryStream();
//Use the Newly Created Memory Stream for the Compressed Data. GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true); compressedzipStream.Write(source, 0, source.Length); compressedzipStream.Close();
ms.Position = 0; dest = ms.ToArray();
ms.Close(); resultcode = 1; } catch { resultcode = 0; } return resultcode;
}
//解压
public int UnCompress(byte[] source, ref byte[] dest) { int resultcode;
try { MemoryStream tempms = new MemoryStream(source); tempms.Position = 0; GZipStream tempzip = new GZipStream(tempms, CompressionMode.Decompress);
dest = GetDeData(tempzip, source); tempzip.Close(); //tempms.Close(); // Console.WriteLine("临时解码数据:{0}", System.Text.Encoding.Default.GetString(dest)); resultcode = 1; } catch { resultcode = 0; } return resultcode; }
public byte[] GetDeData(Stream stream,byte[] temp) //取得解压后的文件数据 { int totalcount = 0; int datalen = temp.Length; int bytecount = datalen;
while (true) { byte[] tempdata = new byte[bytecount]; int bytesread = stream.Read(tempdata, 0, bytecount); if (bytesread == 0) break; totalcount += bytesread; bytecount =totalcount+bytesread; } stream.Close(); MemoryStream ms = new MemoryStream(temp); GZipStream gs = new GZipStream(ms, CompressionMode.Decompress); byte[] alltempdata =new byte[totalcount]; gs.Read(alltempdata, 0, alltempdata.Length); gs.Close(); return alltempdata; } }}
调用类P如下:
public static void Main() { CompressionService.Compression ct = new CompressionService.Compression(); byte[] origialdata = OpenFile(); Console.WriteLine("原始数据长度:{0}", origialdata.Length); byte[] test = null; ct.Compress(origialdata, ref test); Console.WriteLine("压缩后数据长度:{0}", test.Length); byte[] uncompressdata = null; ct.UnCompress(test,ref uncompressdata); Console.WriteLine("解压数据:{0},大小为:{1}",System.Text.Encoding.Default.GetString(uncompressdata).ToString(),uncompressdata.Length); }
public static byte[] OpenFile() { //string test = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzddafdsfsfsfsdafdfa,我们是中国人"; FileStream infile = new FileStream("C://test.txt", FileMode.Open, FileAccess.Read, FileShare.Read); byte[] buffer = new byte[infile.Length]; infile.Read(buffer, 0, buffer.Length);
Console.WriteLine("原始数据:{0}", System.Text.Encoding.Default.GetString(buffer));
// System.Text.Encoding.ASCII.GetString(test )); return buffer; }
如果用来在线压缩和解压缩文件,如下:
public void CompressFile (string sourceFile, string destinationFile ) { // make sure the source file is there if ( File.Exists ( sourceFile ) == false ) throw new FileNotFoundException ( );
// Create the streams and byte arrays needed byte[] buffer = null; FileStream sourceStream = null; FileStream destinationStream = null; GZipStream compressedStream = null;
try { // Read the bytes from the source file into a byte array sourceStream = new FileStream ( sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read );
// Read the source stream values into the buffer buffer = new byte[sourceStream.Length]; int checkCounter = sourceStream.Read ( buffer, 0, buffer.Length );
if ( checkCounter != buffer.Length ) { throw new ApplicationException ( ); }
// Open the FileStream to write to destinationStream = new FileStream ( destinationFile, FileMode.OpenOrCreate, FileAccess.Write );
// Create a compression stream pointing to the destiantion stream compressedStream = new GZipStream ( destinationStream, CompressionMode.Compress, true );
// Now write the compressed data to the destination file compressedStream.Write ( buffer, 0, buffer.Length ); } catch ( ApplicationException ex ) { // MessageBox.Show ( ex.Message, "压缩文件时发生错误:", MessageBoxButtons.OK, MessageBoxIcon.Error ); } finally { // Make sure we allways close all streams if ( sourceStream != null ) sourceStream.Close ( );
if ( compressedStream != null ) compressedStream.Close ( );
if ( destinationStream != null ) destinationStream.Close ( ); } }
public void DecompressFile ( string sourceFile, string destinationFile ) { // make sure the source file is there if ( File.Exists ( sourceFile ) == false ) throw new FileNotFoundException ( );
// Create the streams and byte arrays needed FileStream sourceStream = null; FileStream destinationStream = null; GZipStream decompressedStream = null; byte[] quartetBuffer = null;
try { // Read in the compressed source stream sourceStream = new FileStream (sourceFile, FileMode.Open );
// Create a compression stream pointing to the destiantion stream decompressedStream = new GZipStream (sourceStream, CompressionMode.Decompress, true );
// Read the footer to determine the length of the destiantion file quartetBuffer = new byte[4]; int position = (int)sourceStream.Length - 4; sourceStream.Position = position; sourceStream.Read (quartetBuffer, 0, 4 ); sourceStream.Position = 0; int checkLength = BitConverter.ToInt32 ( quartetBuffer, 0 );
byte[] buffer = new byte[checkLength + 100];
int offset = 0; int total = 0;
// Read the compressed data into the buffer while ( true ) { int bytesRead = decompressedStream.Read ( buffer, offset, 100 );
if ( bytesRead == 0 ) break;
offset += bytesRead; total += bytesRead; }
// Now write everything to the destination file destinationStream = new FileStream ( destinationFile, FileMode.Create ); destinationStream.Write ( buffer, 0, total );
// and flush everyhting to clean out the buffer destinationStream.Flush ( ); } catch ( ApplicationException ex ) { //MessageBox.Show(ex.Message, "解压文件时发生错误:", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { // Make sure we allways close all streams if ( sourceStream != null ) sourceStream.Close ( );
if ( decompressedStream != null ) decompressedStream.Close ( );
if ( destinationStream != null ) destinationStream.Close ( ); }
}
