Komprimieren und Dekomprimieren einer Zeichenfolge in C#
- Definition von Komprimierung
-
die .NET-Datenkompressionsalgorithmen in
C#
-
Verwenden von
GZip
zum Komprimieren einer Zeichenkette inC#
-
Verwenden von
GZip
zum Dekomprimieren eines Strings inC#
Dieser Artikel zeigt, wie wir Komprimierungsmethoden auf das Dateisystem System.IO
anwenden können.
Der Namespace Compression
kann den Wert einer Zeichenkette komprimieren und dekomprimieren. Das Komprimieren der Werte sollte zu einer erheblichen Größenreduzierung in Bytes führen.
Definition von Komprimierung
Kompression bezeichnet in der Physik eine Größenabnahme, die durch nach innen auf eine Masse einwirkende Kräfte entsteht. Wenn wir von Datenkomprimierung sprechen, beziehen wir uns auf die Umwandlung von Daten in ein kompakteres Format ohne erkennbaren Inhaltsverlust.
Datenkomprimierung ist der Prozess, bereits vorhandene Informationen mithilfe von Algorithmen in so wenige Bits zu codieren, wie es für Menschen praktikabel ist. Die Wirksamkeit verschiedener Algorithmen variiert in unterschiedlichem Maße.
Dennoch beinhalten sie im Allgemeinen Kompromisse in Bezug auf die Zeit, die zum Komprimieren der Daten benötigt wird, oder die Menge an Rechenleistung, die von der CPU benötigt wird.
die .NET-Datenkompressionsalgorithmen in C#
Es gibt viele alternative Komprimierungsmethoden, aber für diese Diskussion konzentrieren wir uns auf GZip
. Obwohl es möglich ist, eine Bibliothek eines Drittanbieters wie SharpZipLib
zu verwenden, verwenden wir die Klasse GZipStream
, die für das .NET Framework nativ ist und sich im Namensraum System.IO.Compression
befindet.
Darüber hinaus werden wir das Komprimieren und Dekomprimieren von String-Daten stark betonen; die Prozeduren für den Umgang mit anderen Arten wie Byte-Arrays und Streams werden etwas modifiziert.
Verwenden von GZip
zum Komprimieren einer Zeichenkette in C#
Die einfachste Implementierung von GZipStream
erfordert, dass Benutzer einen zugrunde liegenden Stream und eine Komprimierungsoption als Eingaben bereitstellen. Der Komprimierungsmodus gibt vor, ob Sie die Daten komprimieren oder dekomprimieren möchten; Der zugrunde liegende Stream wird basierend auf der Komprimierungsmethode geändert.
Der folgende Code verwendet einen Speicherstream als unseren zugrunde liegenden Ausgabestream. Der Ausgabestream wird in einen GZipStream
-Container verpackt.
Wenn wir unsere Eingabedaten an den GZipStream
senden, wandern die Daten in komprimierter Form durch die Pipeline zum Ausgabestrom. Wir können garantieren, dass die Daten bereinigt werden, indem wir die Aktion Write
in einen eigenen using
-Block setzen.
Der Methodencode save()
ist im Quellcode am Ende dieses Artikels verfügbar.
public static byte[] Compress(string str) {
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress)) {
save(msi, gZipStream);
}
return memoryStream.ToArray();
}
}
Verwenden von GZip
zum Dekomprimieren eines Strings in C#
Beim Dekomprimieren von Daten wird der dekomprimierte Stream zu einem Eingabestream. Der GZipStream
wird es weiterhin umschließen, aber der Fluss wird jetzt umgekehrt, sodass das Lesen von Daten aus dem GZipStream
die komprimierten Daten in unkomprimierte Daten umwandelt.
Der Modus CompressionMode.Decompress
dient zum Dekomprimieren eines Strings.
public static string Decompress(byte[] bytes) {
using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
using (var gZipStream = new GZipStream(msi, CompressionMode.Decompress)) {
save(gZipStream, memoryStream);
}
return Encoding.UTF8.GetString(memoryStream.ToArray());
}
}
Vollständiger Quellcode zum Komprimieren und Dekomprimieren eines Strings in C#
using System;
using System.IO;
using System.IO.Compression;
using System.Text;
class HelloWorld {
public static void save(Stream source, Stream destination) {
byte[] bytes = new byte[4096];
int count;
while ((count = source.Read(bytes, 0, bytes.Length)) != 0) {
destination.Write(bytes, 0, count);
}
}
public static byte[] Compress(string str) {
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress)) {
save(msi, gZipStream);
}
return memoryStream.ToArray();
}
}
public static string Decompress(byte[] bytes) {
using (var msi = new MemoryStream(bytes)) using (var memoryStream = new MemoryStream()) {
using (var gZipStream = new GZipStream(msi, CompressionMode.Decompress)) {
save(gZipStream, memoryStream);
}
return Encoding.UTF8.GetString(memoryStream.ToArray());
}
}
static void Main(string[] args) {
byte[] string1 = Compress("stringstringstringstringstringstringstringstring");
Console.WriteLine("Zipped Size: " + string1.Length + " bytes");
string string2 = Decompress(string1);
Console.WriteLine("Unzipped Size: " + string2.Length + " bytes");
}
}
Ausgabe:
Zipped Size: 29 bytes
Unzipped Size: 48 bytes
I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.
LinkedInVerwandter Artikel - Csharp String
- C# Int in String konvertieren
- C# String in Enum konvertieren
- Verwendung von Strings in der Switch-Anweisung in C#
- So konvertieren Sie eine Zeichenkette in ein Byte-Array in C#
- Wie konvertiert man eine Zeichenkette in C# in boolesche Zeichenketten
- Wie schreibt man ein mehrzeiliges String-Literal in C#