使用 GZipStream 實現壓縮和解壓縮

概述

之前做項目,涉及到存入到數據庫或者 http 傳輸的數據量比較大,這個時候,就需要考慮在存入數據庫或者發送傳輸之前,將數據壓縮下,當從數據庫中取出時,再解壓還原數據。特地找了下發現有 GZipStream 可以實現這個功能。此類表示 gzip 數據格式,該格式使用行業標準算法進行無損文件壓縮和解壓縮。該格式包括用於檢測數據損壞的循環冗餘校驗值。gzip 數據格式使用與 DeflateStream 類相同的算法,但可以擴展爲使用其他壓縮格式。該格式很容易以專利未涵蓋的方式實施。從. NET Framework 4.5 開始,DeflateStream 類使用 zlib 庫進行壓縮。因此,與. NET Framework 的早期版本相比,它提供了更好的壓縮算法,並且在大多數情況下,提供了較小的壓縮文件。

GZipStream 使用的一般流程如下:

打開一個現有的文件

打開 / 創建輸出文件

創建 GZipStream 對象

逐字節讀源文件,並把它傳遞到 GZipStream

使用 GZipStream 寫入到輸出文件流

代碼實現

1、壓縮字符串

 /// <summary>
        /// 壓縮字串,回傳 Base64 結果
        /// </summary>
        /// <param ></param>
        /// <returns></returns>
        public static string ZipText(string text)
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(text);
            return ZipText(inputBytes);
        }

        public static string ZipText(byte[] inputBytes)
        {
            using (MemoryStream outputStream = new MemoryStream())
            {
                using (GZipStream gs = new GZipStream(outputStream, CompressionMode.Compress))
                {
                    gs.Write(inputBytes, 0, inputBytes.Length);
                }

                byte[] outputBytes = outputStream.ToArray();
                string result = Convert.ToBase64String(outputBytes);
                return result;
            }
        }

2、解壓縮字符串

  /// <summary>
        /// 解壓縮字串
        /// </summary>
        /// <param ></param>
        /// <returns></returns>
        public static string UnzipZippedText(string zippedText)
        {
            if (String.IsNullOrEmpty(zippedText))
            {
                return String.Empty;
            }
            string unzipedText = null;
            try
            {
                byte[] buffer = Convert.FromBase64String(zippedText);
                MemoryStream ms = new MemoryStream(buffer);
                GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress);

                using (StreamReader streamReader = new StreamReader(zipStream))
                {
                    unzipedText = streamReader.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                unzipedText = String.Empty;
            }

            return unzipedText;
        }

運行結果測試,源文件經過壓縮大小隻有 120 字節,而解壓後,源文件與解壓後 txt 的大小一致

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/zSjwjq-hM_ZFwbef75LsBQ