Holger Stehle

Softwareentwicklung und -architektur

« (De-)Kompression durchführen

Zwar ist Speicher heutzutage üblicherweise keine Mangelware mehr, dennoch kann sich die Komprimierung großer Datenmengen, beispielsweise zur Übertragung, lohnen. C# bietet dazu einige Möglichkeiten, so unter anderem zur Arbeit mit ZIP-Archiven. Zu diesen möchte ich jedoch in einem separaten Beitrag kommen und stattdessen zeigen, wie sich mit der DeflateStream-Klasse beliebige Daten(-ströme) (de-)komprimieren lassen:

// Daten komprimieren
public static byte[] Compress(byte[] data) {
    using(MemoryStream inStream = new MemoryStream(data)) {
        using(MemoryStream outStream = new MemoryStream()) {
            using(DeflateStream deflate = new DeflateStream(outStream, CompressionMode.Compress)) {
                inStream.CopyTo(deflate);
            }

            return outStream.ToArray();
        }
    }
}

// Daten dekomprimieren
public static byte[] Decompress(byte[] data) {
    using(MemoryStream inStream = new MemoryStream(data)) {
        using(MemoryStream outStream = new MemoryStream()) {
            using(DeflateStream deflate = new DeflateStream(inStream, CompressionMode.Decompress)) {
                deflate.CopyTo(outStream);
            }

            return outStream.ToArray();
        }
    }
}

Um beispielsweise komplette Dateien effizient zu (de-)komprimieren, kann wie folgt vorgegangen werden:

// Datei komprimieren
public static void CompressFile(string inputPath, string outputPath) {
    using(FileStream inStream = File.OpenRead(inputPath)) {
        using(FileStream outStream = File.OpenWrite(outputPath)) {
            using(DeflateStream deflate = new DeflateStream(outStream, CompressionMode.Compress)) {
                inStream.CopyTo(deflate);
            }
        }
    }
}

// Datei dekomprimieren
public static void DecompressFile(string inputPath, string outputPath) {
    using(FileStream inStream = File.OpenRead(inputPath)) {
        using(FileStream outStream = File.OpenWrite(outputPath)) {
            using(DeflateStream deflate = new DeflateStream(inStream, CompressionMode.Decompress)) {
                deflate.CopyTo(outStream);
            }
        }
    }
}