GZip Komprimierung und Dekomprimierung mit Base64

    • VB.NET

    Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von AliveDevil.

      GZip Komprimierung und Dekomprimierung mit Base64

      Hallo,

      da ich desöfteren gefragt wurde, wie die GZip-Komprimierung geht..hier mein SourceCode für jeden einsehbar:

      Komprimierung.vb

      VB.NET-Quellcode

      1. ' Importieren der benötigten Namespaces
      2. Imports System.IO
      3. Imports System.Security.Cryptography
      4. Imports System.Text
      5. Imports System
      6. Imports System.IO.Compression
      7. Public Class cl_Save ' Klasse cl_Save
      8. Public Shared Function Compress(ByVal value() As Byte) As String ' Komprimieren eines ByteArrays in einen String
      9. Dim buffer() As Byte = value ' Buffer von "value" erstellen
      10. Dim memoryStream = New MemoryStream() ' Einen neuen MemoryStream erstellen
      11. Using gZipStream = New GZipStream(memoryStream, CompressionMode.Compress, True) ' Komprimieren
      12. gZipStream.Write(buffer, 0, buffer.Length) ' schreibe in buffer
      13. End Using
      14. memoryStream.Position = 0 ' Setze Position auf Null
      15. Dim compressedData = New Byte(memoryStream.Length - 1) {} ' Deklariere komprimiere Daten als neues Byte Array mit der Länge von memoryStream
      16. memoryStream.Read(compressedData, 0, compressedData.Length) ' Lese compressedData
      17. Dim gZipBuffer = New Byte(compressedData.Length + 4 - 1) {} ' Neuen gZipBuffer erstellen
      18. System.Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length) ' Kopiere
      19. System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4) ' Kopiere
      20. Return Convert.ToBase64String(gZipBuffer) ' Konvertiere nach Base64
      21. End Function
      22. Public Shared Function DecompressString(ByVal compressedText As String) As Byte() ' Dekomprimieren eines String in ein ByteArray
      23. Dim gZipBuffer() As Byte = Convert.FromBase64String(compressedText) ' Dekodiere den Base64 String
      24. Using memoryStream = New MemoryStream() ' Neuen memorystream erstellen
      25. Dim dataLength As Integer = BitConverter.ToInt32(gZipBuffer, 0) ' Konvertiere die Bits
      26. memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4) ' Schreibe in den Buffer
      27. Dim buffer = New Byte(dataLength - 1) {} ' Deklariere neuen Buffer
      28. memoryStream.Position = 0 ' Setze Position auf Null
      29. Using gZipStream = New GZipStream(memoryStream, CompressionMode.Decompress) ' gZipStream erstellen
      30. gZipStream.Read(buffer, 0, buffer.Length) ' lese alles aus memoryStream und schreibe es in buffer
      31. End Using
      32. Return buffer ' gebe buffer zurück
      33. End Using
      34. End Function
      35. End Class
      36. Module compression_call
      37. Public Sub Main()
      38. Dim tmp_compressed As String = cl_Save.Compress(TextStringToByteArray("Test"))
      39. Dim tmp_decompressed As String = ByteArrayToTextString(cl_Save.DecompressString(tmp_compressed))
      40. Console.WriteLine("Compressed String in Base64 of ""{0}"": {1}", "Test", tmp_compressed)
      41. Console.ReadLine()
      42. Console.WriteLine("Decompressed String of ""{0}"": {1}", tmp_compressed, tmp_decompressed)
      43. Console.ReadLine()
      44. End Sub
      45. Public Function TextStringToByteArray(ByRef str As String) As Byte()
      46. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
      47. Return enc.GetBytes(str)
      48. End Function
      49. Public Function ByteArrayToTextString(ByRef Barr() As Byte) As String
      50. Dim enc As System.Text.Encoding = System.Text.Encoding.Default
      51. Return enc.GetString(Barr)
      52. End Function
      53. End Module


      Die Hauptfunktion ( cl_Save ) habe ich schon Kommentiert...falls jemand eine detailiertere Erklärung haben möchte, soll er dies bitte sagen.
      Zu den anderen Funktionen:

      VB.NET-Quellcode

      1. Dim tmp_compressed As String = Compress(TextStringTobyteArray("Test"))
      2. Dim tmp_decompressed As String = ByteArrayToTextString(DecompressString(tmp_compressed))

      Bewirkt, dass zu erst der Text "Test" in ein ByteArray konvertiert wird und dann mit der Funktion Compress()
      Komprimiert wird.

      Die zwei Console.WriteLine-Zeilen bewirken nur, dass der Text auch angezeigt wird.

      Beispielprojekt und kompilierte DLL sind unter folgenden Links zufinden:

      animated-coding.tk/Media/Defau…oads/GZip-Compression.zip
      Lizenz: CC by SA

      Artikel auf Animated-Coding:
      animated-coding.tk/source-code/gzip/

      AliveDevil

      Änderungen

      Quellcode

      1. 10.11.2012
      2. - Tags hinzugefügt
      3. - Links auf die Bibliothek und den Artikel aktualisiert
      4. 14.12.2011
      5. - Link auf Wordpress aktualisiert.
      6. 04.12.2011
      7. - Link zum Artikel wieder eingefügt
      8. 03.10.2011
      9. - Downloadlinks funktionieren wieder
      10. - Artikel auf Animated-Coding fixed

      Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „AliveDevil“ ()

      Ja....sry...die debian foundation hat meinen server gekillt...
      mache ich morgen...irgendwann...

      Downloadlink wieder verfügbar

      AliveDevil

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „AliveDevil“ ()

      habe eine frage:
      Wie könnte man nun auch einen Ganzen Ordner (mit unterordnern und dateien) so Komplimieren?

      mfg
      1. es heißt Komprimieren
      2. bräuchtest du ein eigenes Dateiformat.
      z.B.:

      Quellcode

      1. RootOrdner\
      2. Datei1|GZip-Base64
      3. Datei2|GZip-Base64
      4. (...)+

      Ansonsten:

      VB.NET-Quellcode

      1. Using Writer As New StreamWriter("file.compressed")
      2. Writer.WriteLine(GZip.Compress(IO.File.ReadAllBytes("file.uncompressed")))
      3. Writer.Flush()
      4. End Using

      Das in eine For-Each- oder For-Schleife und dann jeweils die Dateien auslesen und Komprimieren.
      das musst du selber realisieren.
      Der Code generiert keine regulären Zip Dateien ( also die Archive ) sondern Komprimiert nur ein ByteArray.
      Wenn du nun ein Tool schreiben möchtest, mit dem man Archiv erstellen kann ( natürlich nur eigene, da der Code den Zip Standard nicht einhält ) musst du dir was Ausdenken.
      Z.B. wäre das eine Lösung:

      Quellcode

      1. RootFolder\
      2. Datei|{Base64}
      3. Ordner\
      4. Datei.name|{Bas64}
      5. Date2.name|{Base64}

      da kannste dann einfach jede Zeile auslesen und entsprechend darstellen.

      so kann man das realisieren, muss es aber nicht.