[VB.NET] String in Stream ohne Datei

calvin65

Mitglied
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:
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:
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
 
Hallo!

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

Gruß Tom
 
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:
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
 
Wenn du einen Stream zur Verfügung hast, und du willst darauf Strings schreiben, kannst du das mittels eines StreamWriters machen:

C#:
            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

C#:
            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
 
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:
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:
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
 

Neue Beiträge

Zurück