Как распаковать GZIP средствами Windows

Тема в разделе "WASM.WIN32", создана пользователем Android, 8 июл 2006.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Всем привет
    Как распаковать GZIP средствами Windows. Internet Explorer это как то делает.
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Android
    Это тебе показалось. Есть серверы, которые на лету распаковывают. Winzip и Winrar тоже умеют распаковывать gzip, да и наверно большинство других архиваторов - ведь текст gzip свободный.
    Наконец, есть виндовый gzip.
     
  3. BreakPointMAN

    BreakPointMAN New Member

    Публикаций:
    0
    Регистрация:
    26 июн 2005
    Сообщения:
    42
    Адрес:
    Russia
    Internet Explorer использует возможности библиотеки urlmon.dll, но, как пишут в интернете, функции для работы с gzip не экспортируются.
     
  4. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    Android
    Средствами Windows - не знаю, но можно воспользоваться zlib'ом.
     
  5. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    {8f6b0360-b80d-11d0-a9b3-006097942311}
    Похоже что этот интерфейс отвечает за работу с GZIP, находится в urlmon.dll, но описания не нашел
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Android
    Спутал ты этим интерфейсом. Это CLSID_DeCompMimeFilter, немного не то. Используй интерфейсы IEncodingFilterFactory и IDataFilter.
     
  7. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Прямо в URLMON.dll торчит :
    CLSID\{54c37cd0-d944-11d0-a9f4-006097942311}\InprocServer32 AP GZIP Encoding/Decoding Filter PROTOCOLS\Filter\gzip
    Но вообще-то это называлось во все времена "через ж... резать гланды". Особенно если учесть, что с urlmon у МС всегда проблемы и в каждом сервиспаке и даже патче IE эта функция будет в другом месте.
    Есть текст, есть готовые отлаженные библиотеки, "но мы не ищем легких путей" :)
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    valterg
    Правильно, это CLSID_StdEncodingFilterFac. Он реализует интерфейс IEncodingFilterFactory, в котором можно юзать deflate и gzip.

    А преимущество этого подхода - имеем в винде zip & gz в виде "стандартных" API, то бишь, можно не тянуть библиотеки за собой с этими алгоритмами.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Гм. gzip.dll есть в IIS :) И использует те же функции, что и IDataFilter.
     
  10. YoungBastard

    YoungBastard New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    231
    Адрес:
    Russia
    Android
    если пишешь на cpp, то иди на boost.org и в этой чудной библиотеке есть класс gzipXXX (дальше не помню =)) работающий c потоками cpp(все отлично работает).
    В документации все есть. все описания, только сама библиотека весит 10 мегов, хотя можно по-моему скачать отдельно исходники
     
  11. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    IceStudent
    Я ,когда искал, обнаружил что сначала у МС gzip & deflate были в одном классе, а вот в моем 2000-м SP3 - это разные. Возможно, что наоборот - позже были объединены...

    YoungBastard
    Так не хочет он ничего добавлять. Он думал, что через urlmon.dll - универсальный способ для любого Виндуса, а тут такая лажа ...
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    valterg
    А точнее по поводу классов? Какие именно?
     
  13. YoungBastard

    YoungBastard New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    231
    Адрес:
    Russia
    http://www.boost.org/libs/iostreams/doc/classes/gzip.html
    http://www.boost.org/libs/iostreams/doc/classes/bzip2.html

    Overview

    The class templates basic_gzip_compressor and basic_gzip_decompressor perform compression and decompression based on the GZIP format ([Deutsch3]) using Jean-loup Gailly's and Mark Adler's zlib compression library ([Gailly]). They are implementation as derived classes of the Zlib Filters. The difference between the GZIP and ZLIB formats is that data in the GZIP contains more header information and a different checksum ([Deutsch1], [Deutsch3]).

    Currently, basic_gzip_compressor is a DualUseFilters, but basic_gzip_compressor is only an InputFilter.


    сразу хочу от себя отметить, что нужны хорошие знания по работе с iostream(stl) и iostreams(boost). Потраченные усилия в овладении этими знаниями оправдают себя на все 100%, т.к. boost библиотека очень больших возможностей

    valterg
    =)
    ну, это не менее универсальный, т.к. можно его использовать без включения статических библиотек и будет работать точно под всеми виндусами и не только... =)
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    YoungBastard
    Ну-ну. Включать boost в проект на асме :)
     
  15. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    IceStudent

    Всем спасибо за советы. zlib меня не устраивает.

    Подробного описания IEncodingFilterFactory не нашел. Вот как я пытаюсь реализовать процедуру:

    Код (Text):
    1. GzipDecode proc lpIn:dword,dwIn:dword,lpOut:dword,dwOut:dword
    2. LOCAL   pIEncodingFilterFactory:dword
    3. LOCAL   pIDataFilter
    4.     xor eax,eax
    5.     mov pIEncodingFilterFactory,eax
    6.     invoke  CoCreateInstance,addr CLSID_StdEncodingFilterFac,0,CLSCTX_ALL,\
    7.             addr IID_IEncodingFilterFactory,addr pIEncodingFilterFactory
    8.     if_s
    9.         ;интерфейс IID_IEncodingFilterFactory создается успешно
    10.        
    11.         lea eax,pIDataFilter
    12.         push    eax
    13.         push    ;не пойму смысл этого параметра
    14.         push    ;не пойму смысл этого параметра
    15.         ccall   pIEncodingFilterFactory,IEncodingFilterFactoryVtbl.GetDefaultFilter
    16.         if_s
    17.             ;сюда код не доходит
    18.            
    19.             release pIDataFilter
    20.         .endif
    21.         release pIEncodingFilterFactory
    22.     .endif
    23.     ret
    24. GzipDecode endp
    Что надо передавать в параметры pwzCodeIn и pwzCodeOut метода GetDefaultFilter?
    ; IEncodingFilterFactory __RPC_FAR * This,
    ; /* [in] */ LPCWSTR pwzCodeIn,
    ; /* [in] */ LPCWSTR pwzCodeOut,
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Android
    Кодирование просто. Из асма у меня почему-то не выходит раскодировать, падает внутри декодирования. Хотя из c++ всё проходит успешно.

    --
    А, тебе как раз декодировать.. Пока не в курсе.
     
  17. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    IceStudent
    Расскажи плиз как кодировать, немного теории)
     
  18. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    RFC читай, вся теория там. А чем zlib не устраивает?
     
  19. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    masquer
    Не хочу прикомпилировать дополнительные модули. Мне достаточно самой простой распаковки gzip архивов.
     
  20. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
    хм, ну раз проще искать иголку в стоге сена, тогда ладно