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#のソケット: 応答ストリームを取得する方法は? リンク、文字列の前にそうするいくつかの情報があります:

                        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Создательとして URL を持っています

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 関数は、空白行を読み取るときに 1 つの改行文字を読み取るとすぐに戻ります。GZip データ ストリームの先頭ではなく、キャリッジ リターン文字にストリームが配置される可能性はありませんか?

于 2010-02-06T15:48:02.333 に答える