0

我有一些我用 C# 编写的代码

        string host = new Uri(_url).Host;
        IPHostEntry ipAddress = Dns.GetHostEntry(host);
        IPEndPoint ip = new IPEndPoint(ipAddress.AddressList[0], 80);
        using (Socket s = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
        {
            s.Connect(ip);
            using (NetworkStream n = new NetworkStream(s))
            {
                    byte[] write = encoding.GetBytes(HttpQuery);
                    n.Write(write, 0, write.Length);
                    ReadLine(n);
                    Dictionary<string, string> headers = new Dictionary<string, string>();
                    while (true)
                    {
                        string line = ReadLine(n);
                        if (line.Length == 0)
                        {
                            break;
                        }
                        int index = line.IndexOf(':');
                        if (!headers.ContainsKey(line.Substring(0, index)))
                        {
                            headers.Add(line.Substring(0, index), line.Substring(index + 2));
                        }
                    }

                    string contentEncoding;
                    if (headers.TryGetValue("Content-Encoding", out contentEncoding))
                    {
                        Stream responseStream = n;
                        if (contentEncoding.Equals("gzip"))
                        {
                            responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
                            responseStream.Flush();
                        }
                        else if (contentEncoding.Equals("deflate"))
                        {
                            responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
                        }

                        MemoryStream memStream = new MemoryStream();

                        byte[] respBuffer = new byte[4096];
                        try
                        {
                            int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
                            //int bytesRead = responseStream.ReadByte();
                            while (bytesRead > 0)
                            {
                                memStream.Write(respBuffer, 0, bytesRead);
                                bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
                            }
                        }
                        finally
                        {
                            responseStream.Close();
                        }
                        string str = encoding.GetString(memStream.ToArray());

然后我在这一行有一个异常 InvalidDataException int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);

GZip 标头幻数不正确。

    string ReadLine(Stream stream)
    {
        List<byte> lineBuffer = new List<byte>();
        try
        {
            while (true)
            {
                int b = stream.ReadByte();
                if (b == -1)
                    return null;
                if (b == 10)
                    break;
                if (b != 13)
                    lineBuffer.Add((byte) b);
            }
        }
        catch (Exception)
        {
        }
        return encoding.GetString(lineBuffer.ToArray());
    }

有任何想法吗?

4

2 回答 2

0

一般来说,我在这个主题上找到了一些东西,这里是C# 中的套接字:如何获取响应流?链接,在字符串(s)之前有一些信息可以这样做:

                        Stream responseStream = n;
                        int magicNumber = 0;
                        while (magicNumber != 10)
                        {
                            magicNumber = responseStream.ReadByte();
                        }
                        if (contentEncoding.Equals("gzip"))
                        {
                            responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
                        }

也许我做得不太正确?

nobugz 我用 WttWebRequest 和 HttpWebResponse 编写了非常成功的代码,但是我的页面有 codepape-1251,并且 HttpWebRequest 将 url 从 1251 编码转换为 UTF-8 我对此无能为力,也许你有什么想法?

例如,我的网址为http://myurl.php?name=Мастер%20Создатель

HttpWebRequest将其转换为http://myurl.php?name=%d0%9c%d0%b0%d1%81%d1%82%d0%b5%d1%80+%d0%a1%d0%be%d0% b7%d0%b4%d0%b0%d1%82%d0%b5%d0%bb%d1%8c (UTF-8)

但是将是http://myurl.php?name=%CC%E0%F1%F2%E5%F0%20%D1%EE%E7%E4%E0%F2%E5%EB%FC (windows-1251) ,我不知道如何解决这个问题

于 2010-02-06T16:15:09.320 回答
0

ReadLine 函数在读取空行时读取一个换行符后立即返回。这不会使流定位在回车符而不是 GZip 数据流的开头吗?

于 2010-02-06T15:48:02.333 回答