net ejemplo create copyto asp .net vb.net stream

.net - create - stream c# ejemplo



Convertir una cadena en secuencia (4)

¿Por qué ha convertido datos binarios (imágenes) a una cadena? Esto no tiene sentido ... a menos que estés usando base-64?

De todos modos, para revertir lo que ha hecho, podría intentar usar el new MemoryStream(Encoding.UTF8.GetBytes(text)) .

Esto creará un nuevo MemoryStream cebado con la cadena (a través de UTF8). Personalmente, dudo que funcione: se encontrará con muchos problemas de codificación que tratan datos binarios sin procesar como datos UTF8 ... Espero que la lectura o la escritura (o ambas) arrojen una excepción.

(editar)

Debo añadir que para trabajar con base-64, simplemente obtenga los datos como un byte[] , luego llame a Convert.ToBase64String(...) ; y para recuperar la matriz, simplemente use Convert.FromBase64String(...) .

Respecto a su edición, esto es precisamente lo que traté de advertir más arriba ... en .NET, una cadena no es solo un byte[] , por lo que no puede simplemente llenarlo con datos de imagen binarios. Muchos de los datos simplemente no tendrán sentido para la codificación, por lo que se pueden descartar silenciosamente (o lanzarse una excepción).

Para manejar binarios en bruto (como imágenes) como cadenas, debe usar codificación base-64; esto agrega tamaño, sin embargo. Tenga en cuenta que WebClient podría simplificar esto, ya que expone la funcionalidad byte[] directamente:

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

De todos modos, usando un enfoque estándar de Stream , aquí se explica cómo codificar y decodificar el base-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 }

He descargado una imagen de Internet y la convertí en una cadena (esto no es modificable)

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

¿Cómo puedo volver a convertir el String en Stream?

Entonces puedo usar esa secuencia para obtener la imagen.

Me gusta esto:

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

Pero ahora solo tengo Text String, entonces necesito algo como esto:

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

EDITAR:

Este motor se usa principalmente para descargar páginas web, pero también estoy tratando de usarlo para descargar imágenes. El formato de la cadena es UTF8, como se indica en el código de ejemplo ...

Intenté usar MemoryStream(Encoding.UTF8.GetBytes(Text)) , pero obtuve este error al cargar la transmisión a la imagen:

Se produjo un error genérico en GDI +.

¿Qué se pierde en las conversiones?


La conversión de datos binarios a una cadena de la manera que ha mostrado lo hará inútil. No puedes sacarlo del paquete. La codificación de texto lo manguera.

Necesita usar Base64, como shows de @Marc .


esto funcionara? No tengo idea de en qué formato se encuentra su cadena, por lo que puede ser necesario algún masaje.

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


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... }