проблема кодирования? - PullRequest
2 голосов
/ 23 марта 2011

Я хочу получить изображение из Интернета и превратить его в байтовый массив. Но что-то не так, читая ответ. Я подозреваю, что это вызвано режимами кодирования.

        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 ]

2 голосов
/ 23 марта 2011
    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");

Кодировка Base 64 обычно используется, когда необходимо передать двоичные данные в виде текста ASCII (т.е. как часть элемента XML CData или SOAP в целом) - но не если вы хотите передать двоичный файл ( т.е. изображение) через HTTP.

0 голосов
/ 23 марта 2011

Возвращается в двоичном формате, а не в кодировке 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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...