繁体   English   中英

C#GZipStream突然不起作用

[英]C# GZipStream suddenly not working

我使用GZipStream已有一段时间,没有任何问题。 我没有在函数中更改任何代码,但是现在压缩和解压缩不起作用。 我提取了以下简单示例(也许我一般做错了什么……)。

public static class ZipLib
{
    #region Public Methods

    public static string Unzip(byte[] compressedText)
    {
        try {
            byte[] gzBuffer = compressedText;
            int msgLength = BitConverter.ToInt32(gzBuffer, 0);
            byte[] buffer = new byte[msgLength];
            using (MemoryStream ms = new MemoryStream()) {
                ms.Write(gzBuffer, 4, gzBuffer.Length - 4);

                using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress, true)) {
                    zip.Read(buffer, 0, buffer.Length);
                }
            }
            return Encoding.UTF8.GetString(buffer);
        }
        catch (Exception ex) {
            Debug.WriteLine(ex.Message);
        }
        return "";
    }

    public static byte[] Zip(string text)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(text);
        MemoryStream ms = new MemoryStream();
        using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) {
            zip.Write(buffer, 0, buffer.Length);
        }

        ms.Position = 0;

        byte[] compressed = new byte[ms.Length];
        ms.Read(compressed, 0, compressed.Length);

        byte[] gzBuffer = new byte[compressed.Length + 4];
        Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
        Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);

        return gzBuffer;
    }

    #endregion
}

internal class Program
{
    #region Private Methods

    private static void Main(string[] args)
    {
        string uncompressedIn = "Hallo Welt";
        var compressed = ZipLib.Zip(uncompressedIn);
        var uncompressed = ZipLib.Unzip(compressed);
        Console.WriteLine("Uncompressed Input: " + uncompressedIn);
        Console.WriteLine("Compressed value: " + string.Join(" | ", compressed));
        Console.WriteLine("Uncompressed from compressed: " + string.Join(" | ", uncompressed.ToCharArray()));
        Console.ReadKey();
    }

    #endregion
}

uncompressed值为"\\0\\0\\0\\0" ...

Unzip ,您可以Write MemoryStream ,然后将其提供给GZipStream进行读取,但是:它仍然位于流的末尾,因此您没有倒带。 尝试添加:

ms.Position = 0;

Write 但是请注意,这样做可能会更有效:

using(MemoryStream ms = new MemoryStream(gzBuffer, 4, gzBuffer.Length - 4))
{
     //...
}

这样可以避免重复存储

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM