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"
...
答
在Unzip
,你Write
到MemoryStream
,然后把它交给GZipStream
从阅读,但是:它仍然是在流结束,你没有倒带它。尝试添加:
ms.Position = 0;
之后Write
。但请注意,这可能是更有效地做:
using(MemoryStream ms = new MemoryStream(gzBuffer, 4, gzBuffer.Length - 4))
{
//...
}
这避免了重复
+0
谢谢,现在它可以工作。也许过去一些代码清理操作导致了这个问题,我太盲目了。 – WPFGermany
我试着使用所提供的代码重新您的问题的任何记忆,但我没有得到任何输出全部:https://dotnetfiddle.net/BCSheL。只需编辑该提琴,以便正确重新创建错误。 –
这只能是偶然的工作。 Encoding.UTF8不能处理任意字节值,它们必须是有效的Unicode码点。对byte []进行编码需要Convert.To/FromeBase64String()。 Unzip()方法缺少ms.Position = 0;这从来没有奏效,你应该非常担心之前没有注意到这一点。 –