Ich bin ein Neuling in .net. Ich mache eine Komprimierungs- und Dekomprimierungszeichenfolge in C #. Es gibt ein XML und ich konvertiere in eine Zeichenfolge und danach mache ich eine Komprimierung und Dekomprimierung. Es gibt keinen Kompilierungsfehler in meinem Code, außer wenn ich meinen Code dekomprimiere und meine Zeichenfolge zurückgebe, gibt es nur die Hälfte des XML zurück.
Unten ist mein Code, bitte korrigieren Sie mich, wo ich falsch liege.
Code:
class Program
{
public static string Zip(string value)
{
//Transform string into byte[]
byte[] byteArray = new byte[value.Length];
int indexBA = 0;
foreach (char item in value.ToCharArray())
{
byteArray[indexBA++] = (byte)item;
}
//Prepare for compress
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress);
//Compress
sw.Write(byteArray, 0, byteArray.Length);
//Close, DO NOT FLUSH cause bytes will go missing...
sw.Close();
//Transform byte[] zip data to string
byteArray = ms.ToArray();
System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length);
foreach (byte item in byteArray)
{
sB.Append((char)item);
}
ms.Close();
sw.Dispose();
ms.Dispose();
return sB.ToString();
}
public static string UnZip(string value)
{
//Transform string into byte[]
byte[] byteArray = new byte[value.Length];
int indexBA = 0;
foreach (char item in value.ToCharArray())
{
byteArray[indexBA++] = (byte)item;
}
//Prepare for decompress
System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray);
System.IO.Compression.GZipStream sr = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Decompress);
//Reset variable to collect uncompressed result
byteArray = new byte[byteArray.Length];
//Decompress
int rByte = sr.Read(byteArray, 0, byteArray.Length);
//Transform byte[] unzip data to string
System.Text.StringBuilder sB = new System.Text.StringBuilder(rByte);
//Read the number of bytes GZipStream red and do not a for each bytes in
//resultByteArray;
for (int i = 0; i < rByte; i++)
{
sB.Append((char)byteArray[i]);
}
sr.Close();
ms.Close();
sr.Dispose();
ms.Dispose();
return sB.ToString();
}
static void Main(string[] args)
{
XDocument doc = XDocument.Load(@"D:\RSP.xml");
string val = doc.ToString(SaveOptions.DisableFormatting);
val = Zip(val);
val = UnZip(val);
}
}
Meine XML-Größe beträgt 63 KB.
c#
string
.net-2.0
compression
Mohit Kumar
quelle
quelle
using
.Encoding
den falschen Weg verwenden. Sie benötigen hier Base-64 gemäß der Antwort vonAntworten:
Der Code zum Komprimieren / Dekomprimieren eines Strings
Denken Sie daran, dass
Zip
a zurückgegeben wirdbyte[]
, währendUnzip
a zurückgegeben wirdstring
. Wenn Sie einen String von möchtenZip
, können Sie ihn von Base64 codieren (z. B. mitConvert.ToBase64String(r1)
) (das ErgebnisZip
ist SEHR binär! Sie können ihn nicht auf den Bildschirm drucken oder direkt in eine XML schreiben).Die vorgeschlagene Version ist für .NET 2.0, für .NET 4.0 verwenden Sie die
MemoryStream.CopyTo
.WICHTIG: Der komprimierte Inhalt kann erst in den Ausgabestream geschrieben werden, wenn er
GZipStream
weiß, dass er über alle Eingaben verfügt (dh um effektiv zu komprimieren, werden alle Daten benötigt). Sie müssen sicherstellen, dass SieDispose()
von der,GZipStream
bevor Sie den Ausgabestream überprüfen (zmso.ToArray()
. B. ). Dies geschieht mit demusing() { }
obigen Block. Beachten Sie, dass dies derGZipStream
innerste Block ist und auf den Inhalt außerhalb zugegriffen wird. Gleiches gilt für die Dekomprimierung:Dispose()
vonGZipStream
vor dem Versuch, auf die Daten zuzugreifen.quelle
string s = "X\uD800Y"
. Mir ist aufgefallen, dass es funktioniert, wenn wir die Codierung auf UTF7 ändern ... aber sind wir mit UTF7 sicher, dass alle Zeichen dargestellt werden können?Laut diesem Snippet verwende ich diesen Code und er funktioniert einwandfrei:
quelle
Mit dem Aufkommen von .NET 4.0 (und höher) mit den Stream.CopyTo () -Methoden dachte ich, ich würde einen aktualisierten Ansatz veröffentlichen.
Ich denke auch, dass die folgende Version als klares Beispiel für eine in sich geschlossene Klasse zum Komprimieren regulärer Zeichenfolgen in Base64-codierte Zeichenfolgen nützlich ist und umgekehrt:
Hier ist ein weiterer Ansatz, bei dem die String-Klasse mithilfe der Erweiterungstechniken erweitert wird, um String-Komprimierung und -Dekomprimierung hinzuzufügen. Sie können die folgende Klasse in ein vorhandenes Projekt einfügen und dann folgendermaßen verwenden:
und
Nämlich:
quelle
using
Anweisungen für die MemoryStream-Instanzen. Und zu den F # -Entwicklern da draußen: Verwenden Sie das Schlüsselwortuse
für die Instanz compressorStream / decompressorStream nicht, da sie manuell entsorgt werden müssen, bevor sieToArray()
aufgerufen werdenDies ist eine aktualisierte Version für .NET 4.5 und höher mit async / await und IEnumerables:
Damit können Sie alles
BinaryFormatter
unterstützen, was unterstützt wird, anstatt nur Zeichenfolgen.Bearbeiten:
Falls Sie sich darum kümmern müssen
Encoding
, können Sie einfach Convert.ToBase64String (byte []) verwenden ...Schauen Sie sich diese Antwort an, wenn Sie ein Beispiel brauchen!
quelle
Convert.ToBase64String(byte[])
. Bitte lesen Sie diese Antwort ( stackoverflow.com/a/23908465/3286975 ). Ich hoffe es hilft!Für diejenigen, die noch bekommen magische Zahl im GZip-Header erhalten, ist nicht korrekt. Stellen Sie sicher, dass Sie einen GZip-Stream übergeben. FEHLER und wenn Ihre Zeichenfolge mit PHP gezippt wurde, müssen Sie Folgendes tun:
quelle