• 【转】用.NET 2.0压缩/解压封装的类


    主要功能是可以用来减轻网络数据的传输数据量,

    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 ( );
                }

            }

  • 相关阅读:
    监控服务器的各种方法
    测试用例之翻页功能
    Python:基础知识
    一篇看懂Docker
    Web测试和app测试区别?
    用经济学的思维来看待安全测试的学习
    Moco测试知多少?
    「网易官方」极客战记(codecombat)攻略-沙漠-先有付出 才有回报-no-pain-no-gain
    「网易官方」极客战记(codecombat)攻略-沙漠-山谷的风与牛-canyon-of-storms
    「网易官方」极客战记(codecombat)攻略-沙漠-复查-double-cheek
  • 原文地址:https://www.cnblogs.com/vagerent/p/1283089.html
Copyright © 2020-2023  润新知