使用gzip压缩字符串

时间:2021-11-04 20:00:46

虽然对简单的字符串效率不高,但是对长的字符串还是可以的。

    static string CompressString(string input)
        {
            string retValue = string.Empty;
            if (!string.IsNullOrEmpty(input))
            {
                byte[] byteSource = Encoding.UTF8.GetBytes(input);
                MemoryStream msm = new MemoryStream();
                using (GZipStream gzs = new GZipStream(msm, CompressionMode.Compress, true))
                {
                    gzs.Write(byteSource, 0, byteSource.Length);
                }

                msm.Position = 0;

                byte[] compBytes = new byte[msm.Length];
                msm.Read(compBytes, 0, compBytes.Length);

                msm.Close();

                byte[] finalBuffer = new byte[compBytes.Length + 4];
                Buffer.BlockCopy(compBytes, 0, finalBuffer, 4, compBytes.Length);
                Buffer.BlockCopy(BitConverter.GetBytes(byteSource.Length), 0, finalBuffer, 0, 4);

                retValue = System.Convert.ToBase64String(finalBuffer);
            }

            return retValue;
        }

        static string DecompressString(string input)
        {
            string retValue = string.Empty;
            if (!string.IsNullOrEmpty(input))
            {
                byte[] source = System.Convert.FromBase64String(input);
                using (MemoryStream msm = new MemoryStream())
                {
                    int length = BitConverter.ToInt32(source, 0);
                    msm.Write(source, 4, source.Length - 4);

                    //Console.WriteLine(Encoding.UTF8.GetString(source));

                    msm.Position = 0;
                    byte[] decmpBytes = new byte[length];
                    using (GZipStream gzs = new GZipStream(msm, CompressionMode.Decompress))
                    {
                        gzs.Read(decmpBytes, 0, length);

                        //gzs.CopyTo();
                    }

                    retValue = Encoding.UTF8.GetString(decmpBytes);
                }
            }

            return retValue;
        }