Подтвердить что ты не робот

Преобразование строки в поток

Я загружаю изображение из Интернета и преобразую его в String (это невозможно изменить)

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

Как преобразовать строку в поток?

Поэтому я могу использовать этот поток для получения изображения.

Вот так:

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

Но теперь у меня есть только текстовая строка, поэтому мне нужно что-то вроде этого:

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

EDIT:

Этот движок был в основном использован для загрузки веб-страниц, но я пытаюсь использовать его для загрузки изображений. Формат строки - UTF8, как указано в примере кода...

Я попытался использовать MemoryStream(Encoding.UTF8.GetBytes(Text)), но я получил эту ошибку при загрузке потока в изображение:

Общая ошибка произошла в GDI +.

Что теряется при конверсиях?

4b9b3361

Ответ 1

Почему вы преобразовали двоичные (изображения) данные в строку? Это не имеет смысла... если вы не используете base-64?

В любом случае, чтобы отменить то, что вы сделали, вы можете попробовать использовать new MemoryStream(Encoding.UTF8.GetBytes(text))?

Это создаст новый MemoryStream, заправленный строкой (через UTF8). Лично я сомневаюсь, что это сработает - вы столкнетесь с множеством проблем с кодированием, рассматривая необработанные двоичные данные как данные UTF8... Я ожидаю, что чтение или запись (или и то и другое) приведет к исключению.

(редактировать)

Я должен добавить, что для работы с базой-64 просто получите данные как byte[], затем вызовите Convert.ToBase64String(...); и чтобы вернуть массив, просто используйте Convert.FromBase64String(...).


Повторите свое редактирование, это именно то, о чем я пытался предупредить выше... в .NET строка не просто byte[], поэтому вы не можете просто заполнить ее двоичными данными изображения. Многие данные просто не будут иметь смысла для кодирования, поэтому могут быть тихо сброшены (или выведено исключение).

Чтобы обрабатывать необработанные двоичные файлы (например, изображения) в виде строк, вам необходимо использовать кодировку base-64; это добавляет размер, однако. Обратите внимание, что WebClient может сделать это более простым, поскольку он предоставляет функции byte[] напрямую:

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

В любом случае, используя стандартный подход Stream, здесь, как кодировать и декодировать 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
        }

Ответ 2

Будет ли это работать? Я понятия не имею, в каком формате находится ваша строка, поэтому может потребоваться некоторая массажа.

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

Ответ 3

Преобразование двоичных данных в строку в том виде, в котором вы показывали, сделает ее бесполезной. Вы не можете вытащить его. Текстовое кодирование шланги его.

Вам нужно использовать Base64 - например, @Marc.

Ответ 4

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