当前位置:  开发笔记 > 编程语言 > 正文

将字符串转换为流

如何解决《将字符串转换为流》经验,为你挑选了1个好方法。

我从Internet上下载了一个图像并转换为String(这是不可更改的)

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

如何将String转换回Stream?

所以我可以使用该流来获取图像.

像这样:

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

但是现在我只有Text String,所以我需要这样的东西:

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

编辑:

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

我试过使用了MemoryStream(Encoding.UTF8.GetBytes(Text)),但是在将流加载到图像时遇到了这个错误:

GDI +中发生了一般错误.

什么在转换中迷失了?



1> Marc Gravell..:

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

无论如何,为了扭转你所做的,你可以尝试使用new MemoryStream(Encoding.UTF8.GetBytes(text))

这将创建一个用字符串填充的新MemoryStream(通过UTF8).就个人而言,我怀疑它会起作用 - 你会遇到很多编码问题,将原始二进制文件视为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
        }

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有