程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# GZip 壓縮 / 解壓

C# GZip 壓縮 / 解壓

編輯:C#入門知識

C# GZip 壓縮 / 解壓


有時候我們需要去壓縮數據 如視頻/音頻/內容 等信息 不少應用於套接字編程 不過微軟為我 們提供了一個用於解壓縮的類GZIP不過這東西是很多年以前就開了源代碼的 如RAR則是借 鑒其算法修改增強的一個東西不過我是沒這個算法你們如果想要研究可以去Github上面去搜 索。我在這裡提供兩種放是壓縮 不過真要讓我最喜歡的可能還是MyZip。
        public static byte[] GZipCompress(byte[] bytes)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                using (GZipStream zs = new GZipStream(ms, CompressionMode.Compress))
                    zs.Write(bytes, 0, bytes.Length);
                return ms.ToArray();
            }
        }

上面是壓縮的部分 不過是簡易形式 首先你需要創建或提供一個有效流 然後再new GZipStream(ms, CompressionMode.Compress))眨呀一看也還是挺簡單的嗎ms 是需要存放被壓縮的文件流 然後再把你需要的進行壓縮的字節寫到GZipStream中最後在一個Dispose
public static byte[] GZipDecompress(byte[] bytes)
        {
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                using (GZipStream zs = new GZipStream(ms, CompressionMode.Decompress))
                {
                    byte[] buffer = new byte[512];
                    MemoryStream buf = new MemoryStream();
                    for (int offset; (offset = zs.Read(buffer, 0, 512)) > 0;)
                        buf.Write(buffer, 0, offset);
                    return buf.ToArray();
                }
            }
        }
上面是解壓部4.0可以使用GZipStream.CopyTo函數而不必向我上述有些麻煩的搞定問題 解壓需要提供一個包含需要被解壓的流數據 然後我們在 new GZipStream(ms, CompressionMode .Decompress)只是兩個提供的量不一 下面我們就開始讀取解壓流中的數據 不過解壓流是沒辦法確定 長度的有些人是在已經壓縮好的流中額外添加一部分流用於寄存原始長度 不過那些我想一般是用不到
        public byte[] GZipCompress(byte[] bytes)
        {
            int hContext = 0; // 正文句柄
            int input_used = 0; // 未壓縮尺寸
            int output_used = 0; // 壓縮後尺寸
            InitCompression(); // 初始化壓縮
            CreateCompression(ref hContext, GZIP_LVL); // 創建壓縮正文

            byte[] buffer = new byte[512]; // 壓縮緩沖區
            if (Compress(hContext, bytes, bytes.Length, buffer, 512, ref input_used, ref output_used, GZIP_LVL) != 0)
                Console.WriteLine(error); // 壓縮失敗

            DestroyCompression(hContext); // 銷毀正文對象
            return buffer;
        }
上面是通過GZip.dll進行壓縮的代碼部分 實際上Compress部分一般是要循環壓縮字節的不過 只是簡單 的給大家一個用法到沒必要搞得那麼專業 不過GZip.dll我記得是默認集成在Win8中畢竟是微軟的玩意
        public byte[] GZipDecompress(byte[] bytes)
        {
            int hContext = 0; // 正文句柄
            int input_used = 0; // 輸入尺寸
            int output_used = 0; // 輸出尺寸
            InitCompression(); // 初始化解壓
            CreateCompression(ref hContext, GZIP_LVL); // 創建解壓正文

            byte[] buffer = new byte[512]; // 解壓緩沖區
            if (Decompress(hContext, bytes, bytes.Length, buffer, 512, ref input_used, ref output_used) != 0)
                Console.WriteLine(error); // 解壓失敗

            DestroyCompression(hContext); // 銷毀正文對象
            return buffer;
        }
不過看來看去我還是認為用GZipStream要人性化的多使用API也只是用在C++或E語言的情況下否則 我人也為也沒有任何必要搞那麼麻煩去寫一個利用GZip.dll中導出的函數進行文件的解壓縮。



??

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved