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中導出的函數進行文件的解壓縮。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!