tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
10220
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    calvin65 calvin65 ist offline Mitglied Bronze
    Registriert seit
    Nov 2005
    Beiträge
    31
    Hallo liebe Leute,

    ich versuche momentan mit den Kompressions-Funktionen in System.IO.Compression einen String zu komprimieren. DeflateStream und GzipStream verarbeiten aber beide nur Streams, d.h. es wäre aus den mir vorliegenden Beispielen nur möglich, wenn ich eine Datei auf der Festplatte anlege und diese dann wieder auslese - was ich jedoch vermeiden möchte, es soll höchstens am Ende eine Datei ausgegeben werden.

    Mit:
    Code :
    1
    
    Dim sString as String = stream.ReadToEnd()
    kann man den Textinhalt eines StreamReader in einen String ziehen.

    Gibt es aber eine Möglichkeit, genau das Gegenteil zu tun ?
    Es gibt ja eine Stream-Klasse, zu der die Write-Methode gehört.
    Code :
    1
    2
    3
    4
    5
    
    Dim instance As Stream
    Dim buffer As Byte()
    Dim offset As Integer
    Dim count As Integer
    instance.Write(buffer, offset, count)
    Mein Problem ist jetzt, aus dem String ein Array aus Byte zu erzeugen, und damit den Stream zu füttern.

    Sollte es eine andere Methode geben, die Kompression zu nutzen, wäre ich auch nicht abgeneigt. Vielleicht durch Verwendung der StreamWriter oder ~Reader ?
    Danke schonmal.

    MfG Calvin
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Du könntest du Daten einfach in einen MemoryStream schreiben und anschließend mit dem resultierenden byte[] arbeiten.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    calvin65 calvin65 ist offline Mitglied Bronze
    Registriert seit
    Nov 2005
    Beiträge
    31
    Hallo und Danke für die Idee,

    aber es gibt weiterhin ein Problem:
    "aus dem String ein Array aus Byte zu erzeugen, und damit den Stream zu füttern"
    Denn die Write-Methoden verlangen auch hier ein Array aus Bytes.
    Write - Überschrieben. Schreibt einen Byteblock mit den aus dem Puffer gelesenen Daten in den aktuellen Stream.
    WriteByte - Überschrieben. Schreibt ein Byte an die aktuelle Position im aktuellen Stream.
    Wie kann ich also meinen String in Bytes umwandeln? In ein Array aus Char ist ja kein Problem, aber dann weiter?
    Bisher hab ich dies:
    Code :
    1
    
    byteArray(I) = Microsoft.VisualBasic.AscW(charArray(I))
    aber das dauert halt seine Zeit. Ob es da noch was schnelleres gibt?
    Außerdem, wenn man Text hat möchte ja auch die Codierung, also UTF7 , UTF8 etc. mit übernommen werden.

    MfG Calvin
     

  4. #4
    yan1 yan1 ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Kirchdorf a. d. Krems, OÖ
    Beiträge
    213
    Wenn du einen Stream zur Verfügung hast, und du willst darauf Strings schreiben, kannst du das mittels eines StreamWriters machen:

    Code csharp:
    1
    2
    3
    
                Stream stream = ...;
                StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
                writer.WriteLine("Dieser String wird in den Stream geschrieben");

    Der StreamWriter übernimmt praktisch für dich die Arbeit des umwandelns in ein byte[].

    Wie kann ich also meinen String in Bytes umwandeln? In ein Array aus Char ist ja kein Problem, aber dann weiter?
    Wenn du es selber umwandeln willst, auch kein Problem
    Dazu gibts die Klasse System.Text.Encoding

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    
                Stream stream;
                String myString = "Dieser String wird zuerst in ein byte[] umgewandelt und dann versendet";
                //umwandeln
                Encoding encoding = Encoding.UTF8;  //im UTF8 Zeichensatz versenden
                byte[] byteArray = encoding.GetBytes(myString);
                // versenden/auf Stream schreiben
                stream.Write(byteArray, 0, byteArray.Length);

    Lg, Yanick
     

  5. #5
    calvin65 calvin65 ist offline Mitglied Bronze
    Registriert seit
    Nov 2005
    Beiträge
    31
    Sorry, dass ich erst jetzt antworte, aber ich war "etwas" beschäftigt.

    Wenn du es selber umwandeln willst, auch kein Problem
    Dazu gibts die Klasse System.Text.Encoding
    Stimmt, passt - DANKE...
    Ich hab auch festgestellt, dass die Kompression ja ein Byte-Array möchte und es daher brauchte.

    Hier komprimiere ich so, dass ein Byte-Array rauskommt:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    Dim ZielStream As New MemoryStream
                   Dim CompressStream As New GZipStream(ZielStream, CompressionMode.Compress, True)
                   CompressStream.Write(byteArray, 0, byteArray.Length)
                   CompressStream.Flush()
                   byteArray = ZielStream.ToArray
                   CompressStream.Close()
                   ZielStream.Close()


    Wenn ich jenes dann an die Dekomprimierung übergebe kommt leider nicht vernünftiges bei raus. Am Ende ist sText ein leerer String und byteArray ist leer, also Länge 0.

    Dekomprimierung:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    Dim QuellStream As New MemoryStream
                   QuellStream.Write(byteArray, 0, byteArray.Length)
     
                   Dim DecompressStream As New GZipStream(QuellStream, CompressionMode.Decompress)
                   Select Case nStatus
                      Case 2
                         Dim Reader As New StreamReader(CType(DecompressStream, Stream))
                         sText = Reader.ReadToEnd
                         Reader.Close()
                      Case 3
                         Dim Reader As New BinaryReader(CType(DecompressStream, Stream))
                         byteArray = Reader.ReadBytes(QuellStream.Length)
                         Reader.Close()
                   End Select
     
                   QuellStream.Close()
                   DecompressStream.Close()

    Nebenbei: Wenn ich selbiges für die Dekomprimierung eines aus einer Datei gelesenen (komprimierten) FileStream benutze klappt das richtig.

    Woran könnnte das aber liegen? Gibt es solche Unterschiede zwischen File- und Memorystream oder hab ich "nur" einen Fehler irgendwo?

    MfG Calvin
     

Ähnliche Themen

  1. Datei ohne Stream öffnen
    Von colblake im Forum .NET Café
    Antworten: 3
    Letzter Beitrag: 24.08.10, 15:13
  2. ZIP-Datei von Stream öffnen
    Von the snake II im Forum PHP
    Antworten: 2
    Letzter Beitrag: 05.06.10, 13:00
  3. Antworten: 3
    Letzter Beitrag: 05.01.09, 15:25
  4. Stream an String?
    Von Smily0412 im Forum Java
    Antworten: 6
    Letzter Beitrag: 30.10.07, 16:22
  5. Web-Server Stream Ergebnisse als string
    Von paschy im Forum Java
    Antworten: 0
    Letzter Beitrag: 15.09.04, 01:46