【问题标题】:How to decompress a GZip Compressed String in C#?如何在 C# 中解压缩 GZip 压缩字符串?
【发布时间】:2020-03-23 10:42:24
【问题描述】:

目前一直在尝试解压缩 GZip 压缩的字符串,我正在使用此功能:

private static string Decompress(byte[] bytes)
{
    using (var memoryStream = new MemoryStream(bytes))
    using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
    using (var memoryStreamOutput = new MemoryStream()) 
    {
        gZipStream.CopyTo(memoryStreamOutput);
        var outputBytes = memoryStreamOutput.ToArray();

        string decompressed = Encoding.UTF8.GetString(outputBytes);
        return decompressed;
    }
}

而且每当我运行代码时,我在调用函数时插入的字符串在应该解压缩的地方都没有改变。我也尝试过使用 StreamReader,但也没有用。发生了什么?

【问题讨论】:

  • 您能否在edit 您的问题中包含一些重现您的问题的示例输入和输出?
  • 您提到了“压缩的字符串”,但您的代码使用了字节数组。如果您收到一个字符串,您是如何创建这些字节的? UTF8.GetBytes、Convert.FromBase64String、其他?

标签: c# gzip gzipstream


【解决方案1】:

如果我们首先对它的压缩方式做出合理的假设,那么显示的代码就可以正常工作:

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

static class P
{
    static void Main()
    {
        Console.WriteLine(lipsum.Length); // 61125 chars of lipsum (not shown)
        Console.WriteLine(Encoding.UTF8.GetByteCount(lipsum)); // 61125 bytes of lipsum
        var bytes = Compress(lipsum);
        Console.WriteLine(bytes.Length); // 16795 bytes compressed
        var value = Decompress(bytes);
        Console.WriteLine(value.Length); // 61125 bytes again when decompressed
        Console.WriteLine(value == lipsum); // True - it worked fine
    }
    private static byte[] Compress(string value)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress))
            {
                gZipStream.Write(Encoding.UTF8.GetBytes(value));
            }
            return memoryStream.ToArray();
        }
    }
    private static string Decompress(byte[] bytes)
    {
        using (var memoryStream = new MemoryStream(bytes))
        using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
        using (var memoryStreamOutput = new MemoryStream())
        {
            gZipStream.CopyTo(memoryStreamOutput);
            var outputBytes = memoryStreamOutput.ToArray();

            string decompressed = Encoding.UTF8.GetString(outputBytes);
            return decompressed;
        }
    }

    // MASSIVELY TRUNCATED FOR POST!
    const string lipsum = @"Lorem ipsum dolor sit amet,  ... ac dolor ac hendrerit.";
}

【讨论】:

  • 感谢您的解决方案,尽管我使用了另一个包:ICSharp.SharpZipLib,它运行良好,没有错误,只是稍微修改一下代码!无论如何,谢谢:D
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 2011-04-07
  • 2015-02-06
  • 2010-11-24
  • 2011-08-18
  • 2013-12-15
  • 2011-11-12
  • 2012-01-20
相关资源
最近更新 更多