C#GZipStream突然不工作

问题描述:

我在一段时间内使用GZipStream没有任何问题。我没有更改我的函数中的任何代码,但现在压缩和解压缩不起作用。我已经提取了以下简单的例子(也许我通常做错了什么...)。C#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" ...

+0

我试着使用所提供的代码重新您的问题的任何记忆,但我没有得到任何输出全部:https://dotnetfiddle.net/BCSheL。只需编辑该提琴,以便正确重新创建错误。 –

+0

这只能是偶然的工作。 Encoding.UTF8不能处理任意字节值,它们必须是有效的Unicode码点。对byte []进行编码需要Convert.To/FromeBase64String()。 Unzip()方法缺少ms.Position = 0;这从来没有奏效,你应该非常担心之前没有注意到这一点。 –

Unzip,你WriteMemoryStream,然后把它交给GZipStream从阅读,但是:它仍然是在流结束,你没有倒带它。尝试添加:

ms.Position = 0; 

之后Write。但请注意,这可能是更有效地做:

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

这避免了重复

+0

谢谢,现在它可以工作。也许过去一些代码清理操作导致了这个问题,我太盲目了。 – WPFGermany