【问题标题】:Decompress a GZipped response from the server (Socket)解压来自服务器的 GZipped 响应(套接字)
【发布时间】:2010-04-11 23:06:35
【问题描述】:

嗯,好的,在向服务器发送一些数据后,注意这个特殊部分:

"Accept-Encoding: gzip,deflate\r\n"

我收到以下回复:

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 09 Apr 2010 23:25:27 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.2.8
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Fri, 09 Apr 2010 23:25:27 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding

7aa
??U-?Rh?%?2?w??PM]??7?qZ?K?)???2?&??m???"q??/p9w?????x?[`tA!G???G?5z??????a>k????????Q
???N??
('??f?,(??Y:5B???-?)?3x^0e:j?`,???**???F>G)?2????@???b??????A?k???Ar?n?

但是如何解压呢?请注意,我正在使用 Socket 类来完成所有工作。

我知道如何解压它,但这里的问题在于我无法将数据包与 GZipped 数据、psuedo-psuedocode(或其他任何东西)分开:

Socket sends packet;
Socket reads response from server, stores into a ByteArray;
Create MemoryStream, use ByteArray;
Create GZipStream, use Memorystream;

现在问题出现了;我收到以下错误:

System.IO.InvalidDataException GZip 标头中的幻数不是 正确的。确保您正在通过 GZip 流。

我希望解释足够清楚>__>。

【问题讨论】:

  • 使用wireshark检查你的字节数组与线路上的内容。
  • 我找不到任何问题。

标签: c#-3.0


【解决方案1】:

您需要 gzip 的内容在双换行符之后开始,并且用于(如果存在)Content-Length 字节。你可以从那里开始。

你可以使用System.Web.HttpRequest吗?它将为您处理解析响应的许多管理细节......

还是必须使用原始套接字?

【讨论】:

  • 我尝试将响应直接转换为字符串并使用 "\r\n\r\n" 将其拆分,然后将其转换回字节数组等,但它不起作用。此外,我展示的响应是 x 个不同的响应之一,意思是;每次反应都不一样。我可以使用 HttpWebRequest,但我不想(因为我已经知道如何使用)。我只想使用 Socket 类来做到这一点。这样做的重点是让我学习如何使用 Socket 类而不是 HttpWebRequest 或 TcpClient 来做事。
  • byte[]->string->byte[] 往返失败完全有可能由于编码问题而失败。您可以尝试在不进行拆分的情况下将其转换并转换回来吗?如果字符串不相同,我可以考虑更多尝试。
  • 显然字符串是相同的。 psuedo-psuedocode:接收响应,存入ByteArray[];转换为字符串 A;转换为 ByteArray[];转换为字符串 B;检查字符串 A 和 B.. if (A == B) { Console.Write("Ok.") };
猜你喜欢
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2019-07-28
  • 1970-01-01
相关资源
最近更新 更多