Усеченный ответ для веб-страницы с символом 0x00 - PullRequest
0 голосов
/ 16 ноября 2009

Я пишу программу, которая загружает веб-страницы. Он отлично работает для большинства веб-страниц, но я нашел несколько страниц, где он не работает.

Эти страницы содержат 0x00 символов.

Я могу читать содержимое страницы до этого символа, но не содержимое после.

Я использую эту часть кода, чтобы прочитать ответ:

IAsyncResult ar = null;
HttpWebResponse resp = null;
Stream responseStream = null;
String content = null;
...
resp = (HttpWebResponse)req.EndGetResponse(ar);
responseStream = resp.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
content = sr.ReadToEnd();

В этом примере я использую асинхронный запрос, но пытаюсь выполнить синхронный, и у меня та же проблема.

Я тоже попробую это с тем же результатом:

HttpWebResponse resp = null;
Stream responseStream = null;
String content = new String();
...
responseStream = resp.GetResponseStream();
byte[] buffer = new byte[4096];
int bytesRead = 1;
while (bytesRead > 0)
{
    bytesRead = responseStream.Read(buffer, 0, 4096);
    content += Encoding.UTF8.GetString(buffer, 0, bytesRead);
}

например, проблема возникает для этого URL http://www.daz3d.com/i/search/searchsub?sstring=ps_tx1662b&_m=dps_tx1662b

спасибо за ваши ответы

Euyeusu

Ответы [ 2 ]

1 голос
/ 16 ноября 2009

Ваша проблема - преобразовать полученный контент в строку, где вам нужно удалить эти 0x00 байты:

AutoResetEvent sync = new AutoResetEvent(false);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://...");
request.Proxy.Credentials = CredentialCache.DefaultCredentials;
request.BeginGetResponse((result) =>
{
    StringBuilder content = new StringBuilder();
    using (HttpWebResponse response = 
           request.EndGetResponse(result) as HttpWebResponse)
    using (Stream stream = response.GetResponseStream())
    {
        int read = 1;
        byte[] buffer = new byte[0x1000];
        while (read > 0)
        {
            read = stream.Read(buffer, 0, buffer.Length);
            content.Append(Encoding.UTF8.GetString(buffer
                .TakeWhile((b, index) => index <= read)
                .Where(b => b != 0x00).ToArray()));
        }
        Console.WriteLine(content);
        sync.Set();
    }
}, null);
sync.WaitOne();
0 голосов
/ 19 мая 2010

Это кодировка, которая фактически не работает. Чтобы обойти это, вам придется отфильтровать байты 0x00. Нечто подобное должно сработать:

using System.Net;
using System.IO;
using System.Text;

WebRequest request = WebRequest.Create("url here");
WebResponse response = request.GetResponse();

string html;
using (Stream stream = response.GetResponseStream())
{

    int index = -1, currentByte = 0;
    byte[] buffer = new byte[response.ContentLength];
    while ((currentByte = stream.ReadByte()) > -1)
    {
        if(currentByte > 0) buffer[++index] = (byte)currentByte;
    }

    html = Encoding.ASCII.GetString(buffer, 0, index + 1);
}
...