Преобразовать строку в поток - PullRequest
23 голосов
/ 09 декабря 2008

Я скачал изображение из Интернета и преобразовал его в строку (это нельзя изменить)

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 + произошла общая ошибка.

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

Ответы [ 4 ]

39 голосов
/ 09 декабря 2008

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

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

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

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

Я должен добавить, что для работы с base-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 голосов
/ 09 декабря 2008

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

Dim strAsBytes() as Byte = new System.Text.UTF8Encoding().GetBytes(Text)
Dim ms as New System.IO.MemoryStream(strAsBytes)
1 голос
/ 07 августа 2012
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...
}
1 голос
/ 09 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...