首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GZipStream,如何正确地从GZipStream读取

GZipStream,如何正确地从GZipStream读取
EN

Stack Overflow用户
提问于 2010-02-06 11:16:42
回答 2查看 3.6K关注 0票数 0

我用C#写了一些代码

代码语言:javascript
复制
        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头幻数不正确。

代码语言:javascript
复制
    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());
    }

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2010-02-06 15:48:02

当读取空行时,您的ReadLine函数一读取一行提要字符就会返回。这是否可能使流定位于回车字符,而不是位于GZip数据流的开头?

票数 0
EN

Stack Overflow用户

发布于 2010-02-06 16:15:09

一般来说,我在这个主题上找到了一些东西,这里是Sockets in C#: How to get the response stream?链接,在字符串之前有一些信息可以这样做:

代码语言:javascript
复制
                        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编写了非常简洁的代码,但是我的页面有代码页- 1251,HttpWebRequest将url从1251编码转换为utf-8i,这与此无关,也许您有什么想法吗?

例如,我使用url作为

HttpWebRequest将此转换为 (UTF-8)

但是将会是(windows-1251),我不知道如何解决这个问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2212897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档