2010-04-11 2 views
1

Умм, хорошо, после отправки некоторых данных на сервер, отметив эту конкретную часть:Распаковка ответа с gzip'нутым от сервера (Socket)

"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)[email protected]???b??????A?k???Ar?n? 

Но как его распаковать? Обратите внимание, что я использую класс Socket для выполнения всей работы.

Я знаю, как распаковывать, но проблема здесь заключается в том, что я не могу отделить пакет от сжат GZIP данных, псевдо-psuedocode (или любой другой) о том, как я это делаю:

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

теперь проблема возникает; Я получаю следующее сообщение об ошибке:

System.IO.InvalidDataException The magic number in GZip header is not correct. Make sure you are passing in a GZip stream.

Надеюсь, что объяснение достаточно ясное> __>.

+0

Проверьте ваш bytearray на что-то на проводе с помощью wirehark. – Sharun

+0

Я не могу найти в этом ничего плохого. – Lith

ответ

0

Содержимое, которое вам нужно для gzip, начинается после двойной строки новой строки и идет для (если присутствует) байтов длины содержимого. Вы можете начать там.

Возможно ли использовать System.Web.HttpRequest? Он позаботится о многих административных подробностях анализа ответа для вас ...

Или вам нужно использовать сырые сокеты?

+0

Я попытался преобразовать ответ непосредственно в строку и разбить его с помощью «\ r \ n \ r \ n» и преобразовать его обратно в массив байтов и т. Д., Но это не сработало. Также ответ, который я показываю, является одним из х разных, что означает; ответ каждый раз различается. Я могу использовать HttpWebRequest, но я не хочу (поскольку я уже знаю, как это сделать). Я хочу сделать это, используя только класс Socket. Все дело в том, что я должен научиться делать вещи, используя класс Socket, а не HttpWebRequest или TcpClient. – Lith

+0

Вполне возможно, что ошибка байта [] -> string-> byte [] не удалась из-за проблем с кодировкой. Можете ли вы попробовать преобразовать его и преобразовать обратно, не разделяя между собой? Если строки не идентичны, я могу придумать еще кое-что, что можно попробовать. – sblom

+0

По-видимому, строки идентичны. psuedo-psuedocode: Получить ответ, сохранить в ByteArray []; Преобразование в строку A; Преобразование в ByteArray []; Преобразование в строку B; Проверьте строку A с B .. if (A == B) {Console.Write ("Ok.")}; – Lith

Смежные вопросы