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(); } }
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中導出的函數進行文件的解壓縮。