Почему вы преобразовали двоичные данные (изображения) в строку? Это не имеет смысла ... если вы не используете 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
}