编码问题?

时间:2011-03-23 02:47:12

标签: c# encoding

我想从网上获取一张图片,并将其转换为字节数组。但阅读回应有些不对劲。我怀疑它是由编码模式引起的。

        WebRequest request = WebRequest.Create("http://www.waterfootprint.org/images/gallery/original/apple.jpg");
        request.Method = "GET";
        request.Timeout = 10000;
        using (WebResponse response = request.GetResponse())
        {
            Stream stream = response.GetResponseStream();
            Encoding encoding = Encoding.UTF8;
            StreamReader streamReader = new StreamReader(stream, encoding);

            string responseBody = streamReader.ReadToEnd(); //always invalid characters here
            streamReader.Close();
            stream.Dispose();
            byte[] buffer = Convert.FromBase64String(responseBody); 
        }

我尝试过其他编码方式,例如UTF7,Unicode等,但都是徒劳的。有人能告诉我为什么吗?感谢

2 个答案:

答案 0 :(得分:2)

    StreamReader streamReader = new StreamReader(stream, encoding);

StreamReader TextReader ,它以特定编码从字节流中读取字符。

  

StreamReader专为角色而设计   输入特定的编码,   而Stream类是设计的   用于字节输入和输出。使用   StreamReader用于读取行   来自标准文本文件的信息。

在您的情况下,您会收到原始字节 - 您需要直接使用Stream,使用BinaryReader或更高级别的抽象。

        byte[] buffer = Convert.FromBase64String(responseBody); 

您获得的流不是base64编码的 - 它是纯图像字节流,因此只需直接分配字节,最简单的是WebClient

using(WebClient wc = new WebClient())
byte[] buffer = wc.DownloadData("http://www.waterfootprint.org/images/gallery/original/apple.jpg");
当您必须将二进制数据作为ASCII文本(即作为XML CData元素或SOAP的一部分)传输时,通常会使用

Base 64 encoding - 但如果您要传输二进制文件(即图像)则不会通过HTTP。

答案 1 :(得分:0)

它以二进制形式返回,而不是base-64编码。例如,如果我将代码更改为直接从响应流创建图像,我会看到它出现在PictureBox控件中。

    private void button1_Click(object sender, EventArgs e)
    {
        WebRequest request = WebRequest.Create("http://www.waterfootprint.org/images/gallery/original/apple.jpg");
        request.Method = "GET";
        request.Timeout = 10000;
        using (WebResponse response = request.GetResponse())
        {
            Stream stream = response.GetResponseStream();
            Bitmap b = (Bitmap)Bitmap.FromStream(response.GetResponseStream());
            pictureBox1.Image = b;
        }
    }