Ich benutzte GZipStream für einige Zeit ohne Probleme. Ich habe bei meiner Funktion keinen Code geändert, aber jetzt funktioniert das Komprimieren und Dekomprimieren nicht. Ich habe das folgende einfache Beispiel extrahiert (vielleicht mache ich im Allgemeinen etwas falsch).C# GZipStream funktioniert plötzlich nicht
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
}
Der Wert uncompressed
"\0\0\0\0"
...
Ich habe versucht, das Problem mit dem mitgelieferten Code zu erstellen, aber ich bekomme keine Ausgabe an alles: https://dotnetfiddle.net/BCSheL. Bearbeiten Sie einfach diese Geige, damit Ihr Fehler korrekt neu erstellt wird. –
Dies kann nur durch Zufall funktionieren. Encoding.UTF8 kann keine beliebigen Bytewerte verarbeiten, sie müssen gültige Unicode-Codepoints sein. Die Codierung eines Bytes [] erfordert Convert.To/FromBase64String(). Die Unzip() -Methode fehlt ms.Position = 0; Dies hat noch nie zuvor funktioniert, Sie sollten ziemlich besorgt sein darüber, dies nicht früher zu bemerken. –