带有 0x00 字符的网页的截断响应

发布于 2024-08-11 10:25:30 字数 1118 浏览 2 评论 0原文

我编写了一个下载网页的程序。它适用于大多数网页,但我发现有些网页不起作用。

这些页面包含 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);
}

例如,此网址 http://www.daz3d.com/i/search/searchsub?sstring=ps_tx1662b&_m=dps_tx1662b

感谢您的回复

Euyeusu

I write a program wich download web pages. It works fine for most of web pages but i have found some pages where it doesn't work.

These pages contains 0x00 characters.

I'm able to read page content until this character, but not the content after.

I use this part of code to read the response :

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();

In this example i use asynchronous request, but i try with synchronous one and i have the same probleme.

I also try this with the same result :

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);
}

for example, the problem occurs for this url http://www.daz3d.com/i/search/searchsub?sstring=ps_tx1662b&_m=dps_tx1662b

thanks for yours responses

Euyeusu

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

懒猫 2024-08-18 10:25:30

您的问题是将接收到的内容转换为字符串,您需要删除那些 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();

Your problem is to transform received content to string, where you need to remove those 0x00 bytes:

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();
梦归所梦 2024-08-18 10:25:30

实际上是编码失败了。要解决这个问题,您必须过滤掉 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);
}

It is the encoding that actually fails. To get around it you'll have to filter out the 0x00 bytes. Something like this should do the trick:

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文