23

我从网上下载了一张图片并转换为字符串(这是不可更改的)

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)

编辑:

该引擎主要用于下载网页,但我也在尝试使用它来下载图像。字符串的格式为 UTF8,如示例代码中所示...

我尝试使用MemoryStream(Encoding.UTF8.GetBytes(Text)),但在将流加载到图像时出现此错误:

GDI+ 中出现一般错误。

转换中丢失了什么?

4

4 回答 4

40

为什么要将二进制(图像)数据转换为字符串?这没有任何意义......除非您使用的是base-64?

无论如何,要扭转您所做的事情,您可以尝试使用new MemoryStream(Encoding.UTF8.GetBytes(text))?

这将创建一个以字符串(通过 UTF8)启动的新 MemoryStream。就个人而言,我怀疑它会起作用——你会遇到很多将原始二进制视为 UTF8 数据的编码问题……我希望读取或写入(或两者)都会抛出异常。

(编辑)

我应该添加它以使用 base-64,只需将数据获取为 a byte[],然后调用Convert.ToBase64String(...); 并取回数组,只需使用Convert.FromBase64String(...).


重新编辑,这正是我在上面试图警告的内容......在.NET中,字符串不仅仅是 a 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
        }
于 2008-12-08T22:22:15.797 回答
4

这行得通吗?我不知道你的字符串是什么格式,所以可能需要一些按摩。

Dim strAsBytes() as Byte = new System.Text.UTF8Encoding().GetBytes(Text)
Dim ms as New System.IO.MemoryStream(strAsBytes)
于 2008-12-08T22:23:50.430 回答
1

以您显示的方式将二进制数据转换为字符串将使其无用。你不能把它拉出来。文本编码管它。

您需要使用 Base64 - 如@Marc节目。

于 2008-12-09T00:19:03.207 回答
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...
}
于 2012-08-07T18:00:21.193 回答