2010-06-15 12 views
24

Ich bin auf der Suche nach einigen Empfehlungen zum Komprimieren von Daten in .NET, abgesehen von der GZipStream-Klasse. Ich bin auf der Suche nach schnellen und hohen Komprimierung von Byte-Arrays, um sie über TCP zu senden.Empfehlungen für .NET-Komprimierungsbibliothek

Vielen Dank.

+0

Es würde helfen, wenn Sie erklären, warum/wenn Sie 'GZipStream' nicht mögen. –

+0

Nicht sagen, dass ich es nicht mag - nur auf der Suche nach Alternativen, die mir bessere Leistung und höhere Komprimierungsraten geben könnten. Kommerzielle Bibliotheken sind auch willkommen –

Antwort

4

SharpZipLib ist eine Alternative. Es wird gesagt, dass es mehr geschrieben nachdenklich als die Framework-Bibliothek GZipStream

+0

Ich werde es auf jeden Fall überprüfen - danke –

+7

SharpZipLib ist nicht gepflegt und fehlerhaft. Letzte Veröffentlichung im Juni 2010. Es hat manchmal Probleme mit ZIP-Dateien, die mit 7zip, ioniczip usw. erstellt wurden, obwohl die ZIP-Dateien völlig in Ordnung sind. Wir verwenden es für eine Komponente bei meiner Arbeit und mussten auf die Reparatur der Quelle und das lokale Bauen zurückgreifen, was kein großer Deal ist, aber nicht etwas, in das man sich begeben muss, wenn man nach einer schlüsselfertigen Zip-Bibliothek sucht . – aggieNick02

+0

@ aggieNick02 Könnten Sie den festen Quellcode hochladen? – mafu

8

DotNetZip bietet native Unterstützung und hat eine recht freundliche API und ist meiner Meinung nach flexibler als SharpZipLib:

DotNetZip

EDIT: Leider DotNetZip hat einige kritische Probleme und das Projekt scheint nicht mehr aktiv gepflegt werden. Daher kann diese Bibliothek nicht wirklich für die Verwendung in Produktionscode empfohlen werden.

Bessere Alternativen wären SharpZipLib (wenn Sie ihre GPL-basierte Lizenz erfüllen), eine der .NET ports of zlib oder die Zip-Unterstützung von .NET 4.5 wie in this answer gezeigt.

+0

Ich habe schlechte Erfahrungen mit DotNetZip gemacht, es kann keine Zip-Archive öffnen, die mit anderen Bibliotheken perfekt geöffnet werden können. Es wirft z.B. OverflowException aus irgendeinem Grund, die ich nicht herausfinden konnte. – lama12345

+0

@ lama12345: Vielen Dank, dass Sie darauf hingewiesen haben. Inzwischen sind mir auch die DotNetZip-Probleme bekannt, da diese mich auch gebissen haben. Ich habe meine Antwort aktualisiert. –

+0

@Cheeso: Irgendwelche Updates über die Zukunft des DotNetZip-Projekts? Gibt es eine Möglichkeit, das Projekt zu unterstützen? –

10

Wenn Sie Daten komprimieren, dann können Sie Serialisierung mit hoher Dichte statt Komprimierung betrachten. Etwas wie Protobuf. Es gibt eine few C# implementations here. Für vorhandene Objekte ist protobuf-net IMO die einfachste zu implementieren (Offenbarung: Ich bin der Autor - aber es ist kostenlos usw.). Sie serialisieren nur den Stream, oder wenn Sie eine byte[] möchten, eine separate MemoryStream.

Für kontinuierliche Verwendung über eine Buchse (anstelle der diskreten Anforderung/Antwort von HTTP), würde ich an den Serializer.SerializeWithLengthPrefix/Serializer.DeserializeWithLengthPrefix Operationen vorschlägt, Blick (protobuf nicht selbst einen Terminator enthalten, so ein längs- Präfix ist notwendig, um getrennte Nachrichten zu behandeln).

+0

sehr interessant - ich werde es versuchen. danke –

+0

Marc, was bedeutet "High-Density-Serialisierung", vor allem im Gegensatz zur Komprimierung? Verwendet es ein Komprimierungsschema oder ist es nur eine effiziente Möglichkeit, Daten darzustellen? Können Sie eine kurze Erklärung oder einen Hinweis zum Lesen geben? –

+0

@ 0xA3 - was ich meine ist: wenn dies typische App-Daten sind (die Sie möglicherweise als XML oder JSON darstellen), dann verwenden Sie einen anderen Serializer, um die gleichen Daten in weniger Bytes zu schreiben. Anstatt "" schreiben Sie stattdessen 2 oder 3 Bytes. Nicht geeignet für * beliebige * 'byte []' obwohl. –

1

.NET 3+ verfügt jetzt über integrierte Zip-Unterstützung mit der Klasse ZipPackage.

+0

Leider bietet dies nur irgendeine Art von Zip-Unterstützung. Sie können zip-basierte "Pakete" erstellen, aber diese Pakete sind keine reinen Zip-Dateien, sondern Pakete, wie sie in den OpenPackaging Conventions (OPC-Format) beschrieben sind. Diese Pakete bestehen aus den Elementen PackagePart und PackageRelationship. Dieses Format ist wahrscheinlich am besten als das vom Office OpenXML-Format verwendete Containerformat bekannt. –

+0

Was ist mit IONIC Zip-Bibliothek? –

1

LZMA soll zu den besten für die Komprimierung gehören. 7-Zip ist eine Public-Domain-SDK Implementierung von LZMA, hier frei heruntergeladen werden:

http://www.7-zip.org/sdk.html

Wikipedia on compression algorithms:

7z der LZMA-Algorithmus erreicht ein höheres Verdichtungsverhältnis als RAR, mit Ausnahme von „Multimedia "Dateien wie .wav und .bmp Dateien, in denen RAR spezialisierte Routinen verwendet, die LZMA übertreffen. [7] Andere kostenlose Kompressionssoftware wie wie NanoZip und FreeArc normalerweise Out Win Win WinRAR. [8]

+0

Ich bin ein großer Fan von 7-Zip, aber nicht sicher, wie zugänglich die API ist. –

+2

Der Link verweist auf das LZMA-SDK, das über eine C# -API verfügt und öffentlich zugänglich ist. – code4life

+0

Leider wurde das C# SDK in 10 Jahren nicht aktualisiert und unterstützt LZMA2 nicht. – mafu

Verwandte Themen