Ответ 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
}