2008-12-08 12 views
23

habe ich aus dem Internet ein Bild herunterladen und in einen String konvertiert (Dies ist nicht veränderbar)Konvertieren ein String zum Streamen von

Dim Request As System.Net.WebRequest = _ 
    System.Net.WebRequest.Create(_ 
    "http://www.google.com/images/nav_logo.png") 

Dim WebResponse As System.Net.HttpWebResponse = _ 
    DirectCast(Request.GetResponse(), System.Net.HttpWebResponse) 

Dim Stream As New System.IO.StreamReader(_ 
    WebResponse.GetResponseStream, System.Text.Encoding.UTF8) 

Dim Text as String = Stream.ReadToEnd 

Wie kann ich den String zurück in den Stream-Format konvertieren?

So kann ich diesen Stream verwenden, um das Bild zu erhalten.

So:

Dim Image As New Drawing.Bitmap(WebResponse.GetResponseStream) 

Aber jetzt habe ich nur die Textzeichenfolge, so brauche ich so etwas wie dieses:

Dim Stream as Stream = ReadToStream(Text, System.Text.Encoding.UTF8) 
Dim Image As New Drawing.Bitmap(Stream) 

EDIT:

Dieser Motor in erster Linie wurde verwendet für Webseiten herunterladen, aber ich versuche es auch zum Herunterladen von Bildern zu verwenden. Das Format der Zeichenfolge ist UTF8, wie im Beispielcode gegeben ...

Ich habe versucht, die MemoryStream(Encoding.UTF8.GetBytes(Text)) zu verwenden, aber ich habe diesen Fehler, wenn der Strom auf das Bild geladen:

Ein generischer Fehler ist in GDI + aufgetreten.

Was geht bei den Konvertierungen verloren?

+0

Ich werde udpate re Ihre Bearbeitung –

Antwort

38

Warum haben Sie binäre (Bild-) Daten in eine Zeichenfolge konvertiert? Das macht keinen Sinn ... es sei denn, Sie verwenden base-64?

Wie auch immer, um umzukehren, was Sie getan haben, könnten Sie versuchen, new MemoryStream(Encoding.UTF8.GetBytes(text)) zu verwenden?

Dies erstellt einen neuen MemoryStream, der mit der Zeichenfolge (über UTF8) vorbereitet wurde. Persönlich bezweifle ich, dass es funktionieren wird - Sie werden in viele Codierprobleme geraten, die rohe Binärdateien als UTF8-Daten behandeln ... Ich erwarte, dass das Lesen oder Schreiben (oder beide) eine Ausnahme auslöst.

(edit)

ich hinzufügen, dass sollte mit Base-64 zu arbeiten, einfach die Daten bekommen als byte[], dann rufen Convert.ToBase64String(...); und um das Array zurück zu bekommen, verwenden Sie einfach Convert.FromBase64String(...).


Re Ihre bearbeiten, das ist genau das, was ich versuchte, über oben zu warnen ... in .NET, ein String ist nicht nur ein byte[], so dass Sie nicht einfach mit binären Bilddaten füllen. Viele der Daten sind für die Codierung einfach nicht sinnvoll und können daher in Ruhe gelöscht werden (oder eine Ausnahme ausgelöst werden).

Um rohe Binärdateien (z. B. Bilder) als Zeichenfolgen zu verarbeiten, müssen Sie die base-64-Codierung verwenden. Dies fügt jedoch Größe hinzu. Beachten Sie, dass WebClient könnte dies einfacher machen, da es direkt byte[] Funktionalität macht:

using(WebClient wc = new WebClient()) { 
    byte[] raw = wc.DownloadData("http://www.google.com/images/nav_logo.png") 
    //... 
} 

Wie auch immer, einen Standard-Stream Ansatz, hier ist, wie zu kodieren und dekodieren die Basis-64:

 // ENCODE 
     // where "s" is our original stream 
     string base64; 
     // first I need the data as a byte[]; I'll use 
     // MemoryStream, as a convenience; if you already 
     // have the byte[] you can skip this 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      byte[] buffer = new byte[1024]; 
      int bytesRead; 
      while ((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, bytesRead); 
      } 
      base64 = Convert.ToBase64String(ms.GetBuffer(), 0, (int) ms.Length); 
     } 

     // DECODE 
     byte[] raw = Convert.FromBase64String(base64); 
     using (MemoryStream decoded = new MemoryStream(raw)) 
     { 
      // "decoded" now primed with the binary 
     } 
2

Wird diese Arbeit?Ich habe keine Ahnung, in welchem ​​Format sich Ihre Zeichenfolge befindet, daher kann eine gewisse Massierung erforderlich sein.

Dim strAsBytes() as Byte = new System.Text.UTF8Encoding().GetBytes(Text) 
Dim ms as New System.IO.MemoryStream(strAsBytes) 
1

Konvertieren von Binärdaten in eine Zeichenfolge in der Art, wie Sie gezeigt haben, macht es unbrauchbar. Sie können es nicht auspacken. Die Textkodierung schlaucht es ein.

Sie müssen Base64 verwenden - wie @Marc zeigt.

1
var bytes = new byte[contents.Length * sizeof(char)]; 
Buffer.BlockCopy(contents.ToCharArray(), 0, bytes, 0, bytes.Length); 
using(var stream = new MemoryStream(bytes)) 
{ 
    // do your stuff with the stream... 
} 
Verwandte Themen