木子屋 Dnawo's BLOG

GZipStream压缩/解压字符串改进版(C#)

👤 dnawo 📅 2009-12-25 👁 7412 👍 0 💬 0 🔄 来源:本站原创
//using System.IO;
//using System.IO.Compression;

/// <summary>
/// GZipStream压缩字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
static Stream GZipCompress(string str)
{
    MemoryStream msReturn;
    using (MemoryStream msTemp = new MemoryStream())
    {
        using (GZipStream gz = new GZipStream(msTemp, CompressionMode.Compress, true))
        {
            using (BinaryWriter writer = new BinaryWriter(gz))
            {
                writer.Write(Encoding.UTF8.GetBytes(str));
            }
            gz.Close();
            msReturn = new MemoryStream(msTemp.GetBuffer(), 0, (int)msTemp.Length);
        }
    }
    return msReturn;
}

/// <summary>
/// GZipStream解压字符串
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
static string GZipDecompress(Stream stream)
{
    using (GZipStream gz = new GZipStream(stream, CompressionMode.Decompress))
    {
        using (StreamReader reader = new StreamReader(gz, Encoding.UTF8))
        {
            return reader.ReadToEnd();
        }
    }
}

测试中发现问题:

·GZipCompress方法中使用StreamWriter则无法往gz写入内容;
·GZipCompress方法中msReturn先初始化再复制msTemp时,一定要将当前流位置设置为0,否则解压不出内容:
static Stream GZipCompress(string str)
{
    [color=Red]MemoryStream msReturn = new MemoryStream();[/color]

    using (MemoryStream msTemp = new MemoryStream())
    {
        using (GZipStream gz = new GZipStream(msTemp, CompressionMode.Compress, true))
        {
            using (BinaryWriter writer = new BinaryWriter(gz))
            {
                writer.Write(Encoding.UTF8.GetBytes(str));
            }

            gz.Close();
            [color=Red]msReturn.Write(msTemp.GetBuffer(), 0, (int)msTemp.Length);
            msReturn.Seek(0, SeekOrigin.Begin);//非常重要[/color]
        }
    }

    return msReturn;
}

评论(0)

暂无评论。

验证码
评论需审核通过后显示
← 上一篇 动易短信通接口调用类(C#) 下一篇 → C#设置/读取CDATA 节点内容