2008-12-08 4 views
23

Tôi đã tải một hình ảnh từ Internet và chuyển đổi sang một String (Đây không phải là thay đổi)Chuyển đổi một chuỗi để Stream

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 

Làm thế nào tôi có thể chuyển đổi String trở lại Luồng?

Vì vậy, tôi có thể sử dụng luồng đó để tải hình ảnh.

Như thế này:

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

Nhưng bây giờ tôi đã chỉ Text String, vì vậy tôi cần một cái gì đó như thế này:

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

EDIT:

Động cơ này được sử dụng chủ yếu cho tải xuống các trang web nhưng tôi cũng đang cố gắng sử dụng nó để tải xuống hình ảnh. Định dạng của chuỗi là UTF8, như được đưa ra trong ví dụ mã ...

Tôi đã cố gắng sử dụng MemoryStream(Encoding.UTF8.GetBytes(Text)), nhưng tôi đã nhận lỗi này khi tải suối đến hình ảnh:

Đã xảy ra lỗi chung trong GDI +.

Điều gì bị mất trong chuyển đổi?

+0

Tôi sẽ lặp lại chỉnh sửa của bạn –

Trả lời

38

Tại sao bạn chuyển đổi dữ liệu nhị phân (hình ảnh) thành chuỗi? Điều này không có nghĩa ... trừ khi bạn đang sử dụng base-64?

Dù sao, để đảo ngược những gì bạn đã làm, bạn có thể thử sử dụng new MemoryStream(Encoding.UTF8.GetBytes(text))?

Điều này sẽ tạo ra một MemoryStream mới được mồi bằng chuỗi (qua UTF8). Cá nhân, tôi nghi ngờ nó sẽ làm việc - bạn sẽ chạy vào rất nhiều vấn đề mã hóa xử lý nguyên nhị phân như dữ liệu UTF8 ... Tôi mong đợi hoặc là đọc hoặc viết (hoặc cả hai) để ném một ngoại lệ.

(chỉnh sửa)

tôi nên thêm rằng để làm việc với cơ sở-64, chỉ cần lấy dữ liệu như một byte[], sau đó gọi Convert.ToBase64String(...); và để lấy lại mảng, chỉ cần sử dụng Convert.FromBase64String(...).


Re chỉnh sửa của bạn, đây chính xác là những gì tôi đã cố gắng để cảnh báo về trên ... trong .NET, một chuỗi không chỉ là một byte[], vì vậy bạn có thể không chỉ đơn giản điền vào nó với dữ liệu hình ảnh nhị phân. Rất nhiều dữ liệu đơn giản sẽ không có ý nghĩa đối với việc mã hóa, vì vậy có thể được giảm nhẹ (hoặc một ngoại lệ được ném).

Để xử lý nhị phân thô (chẳng hạn như hình ảnh) dưới dạng chuỗi, bạn cần sử dụng mã hóa base-64; điều này cho biết thêm kích thước, tuy nhiên. Lưu ý rằng WebClient có thể làm đơn giản này, vì nó cho thấy byte[] chức năng trực tiếp:

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

Dù sao, sử dụng một Stream tiếp cận tiêu chuẩn, dưới đây là cách để mã hóa và giải mã các cơ sở-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

Liệu điều này công việc?Tôi không biết định dạng chuỗi của bạn là gì, vì vậy một số việc xoa bóp có thể là cần thiết.

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

Chuyển đổi dữ liệu nhị phân thành chuỗi theo cách bạn đã hiển thị sẽ hiển thị nó vô dụng. Bạn không thể kéo nó ra. Mã hóa văn bản sẽ đóng nó.

Bạn cần sử dụng Base64 - như @Marc chương trình.

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