GZip字符串壓縮


字符壓縮,壓縮的整體說:https://blog.csdn.net/lanmenghcc/article/details/40071923

總計:

1.7z壓縮率最高,沒測試,但只能文件壓縮不能字符串壓縮。

2.GZip和zlib可以進行字符串流壓縮,對比GZip一般為文件壓縮,壓縮數據還是用的zlib。zlib為純數據的壓縮,壓縮完比gzip少16個字節的頭部文件標識。

3.gzip微軟系統包有集成、zlib需要另外引入包。

4.壓縮測試對於字符串比較小,大概256字符串左右,壓縮字符串比壓縮前還大。畢竟壓縮還是要標記些東西

對比下來還是用gzip壓縮。

下面貼代碼GZip壓縮和解壓:

壓縮

        /// <summary>
        /// GZip壓縮 256字節以上才有壓縮效果
        /// </summary>
        /// <param name="strData">壓縮字符串</param>
        /// <returns></returns>
        public static string Compress(string strData)
        {
            try
            {
                byte[] data = Encoding.GetEncoding("UTF-8").GetBytes(strData);
                using (var ms = new MemoryStream())
                {
                    using (var zip = new GZipStream(ms, CompressionMode.Compress, true))
                    {
                        zip.Write(data, 0, data.Length);
                    }

                    var buffer = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(buffer, 0, buffer.Length);
                    return Convert.ToBase64String(buffer);
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }

解壓:

            try
            {
                byte[] data = Convert.FromBase64String(strData);
                using (var ms = new MemoryStream(data))
                {
                    using (var zip = new GZipStream(ms, CompressionMode.Decompress, true))
                    {
                        using (var msreader = new MemoryStream())
                        {
                            var buffer = new byte[0x1000];//4M存儲大小
                            while (true)
                            {
                                var reader = zip.Read(buffer, 0, buffer.Length);
                                if (reader <= 0)
                                {
                                    break;
                                }
                                msreader.Write(buffer, 0, reader);
                            }
                            msreader.Position = 0;
                            buffer = msreader.ToArray();
                            return Encoding.GetEncoding("UTF-8").GetString(buffer);
                        } 
                    }
                }
            }
            catch (Exception ex)
            {
                return null;
            }

 

zlib壓縮和解壓:

壓縮:

        public static string Zip(string value)
        {
            byte[] byteArray = Encoding.UTF8.GetBytes(value);
            byte[] tmpArray;

            using (MemoryStream ms = new MemoryStream())
            {
                using (zlib.ZOutputStream outZStream = new zlib.ZOutputStream(ms, zlib.zlibConst.Z_DEFAULT_COMPRESSION))
                {
                    outZStream.Write(byteArray, 0, byteArray.Length);
                    outZStream.Flush();
                }
                tmpArray = ms.ToArray();
            }
            return Convert.ToBase64String(tmpArray);
        }

解壓:有點長沒縮減

        /// <summary>
        /// 解壓縮字節數組
        /// </summary>
        /// <param name="sourceByte">需要被解壓縮的字節數組</param>
        /// <returns>解壓后的字節數組</returns>
        private static byte[] deCompressBytes(byte[] sourceByte)
        {
            MemoryStream inputStream = new MemoryStream(sourceByte);
            Stream outputStream = deCompressStream(inputStream);
            byte[] outputBytes = new byte[outputStream.Length];
            outputStream.Position = 0;
            outputStream.Read(outputBytes, 0, outputBytes.Length);
            outputStream.Close();
            inputStream.Close();
            return outputBytes;
        }
        /// <summary>
        /// 解壓縮流
        /// </summary>
        /// <param name="sourceStream">需要被解壓縮的流</param>
        /// <returns>解壓后的流</returns>
        private static Stream deCompressStream(Stream sourceStream)
        {
            MemoryStream outStream = new MemoryStream();
            ZOutputStream outZStream = new ZOutputStream(outStream);
            CopyStream(sourceStream, outZStream);
            outZStream.finish();
            return outStream;
        }

        /// <summary>
        /// 復制流
        /// </summary>
        /// <param name="input">原始流</param>
        /// <param name="output">目標流</param>
        public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
        {
            byte[] buffer = new byte[2000];
            int len;
            while ((len = input.Read(buffer, 0, 2000)) > 0)
            {
                output.Write(buffer, 0, len);
            }
            output.Flush();
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM