Здравствуйте, Аноним, Вы писали:
А>Кто пользовался интерфейсами :
А>IEncodingFilterFactory А>IDataFilter
А>для распаковки gzip архивов в винде, в частности интнресует и распаковка средствами винды потока данных А> при работе с ftp сервером в MODE Z.
Здравствуйте, Аноним, Вы писали:
А> Код отрабатывается без ошибок, но dwWritten всегда равно 10 А> При любом содержимом char *Data, хотя dwRead всегда равно strlen(Data). А>
Есть такие грабельки (точнее особенность работы), внутри DoEncode происходит накапливание данных в свой буфер и очевидно она возвращает не все данные, а только часть (в данном случае 10 байт — заголовок gzip архива). Сделано это потому что сжатие может происходить на уровне битов и естественно не понятно как вернуть в буфер результат например в 50 битов длиной. Если же вам надо финализировать архив, то функция добавляет свой маркер конца архива и выравнивает это хозяйство до кратного 8 битам размера. Это ответ почему так происходит. Теперь ответ на вопрос "что делать?". Вызвать DoEncode ещё раз, но в качестве длины входных данных передать 0. Ну и зная что кусочек кода ценится выше всяких объяснений, вот функция распаковки gzip архива которая работает нормально:
для распаковки gzip архивов в винде, в частности интнресует и распаковка средствами винды потока данных
при работе с ftp сервером в MODE Z.
Re: Распаковка gzip и IDataFilter
От:
Аноним
Дата:
18.05.07 06:30
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Кто пользовался интерфейсами :
А>IEncodingFilterFactory А>IDataFilter
А>для распаковки gzip архивов в винде, в частности интнресует и распаковка средствами винды потока данных А> при работе с ftp сервером в MODE Z.
Я так понял, что распаковка у вас получилась.
А что на счет запаковки
У меня что-то не получается ...
Код отрабатывается без ошибок, но dwWritten всегда равно 10
При любом содержимом char *Data, хотя dwRead всегда равно strlen(Data).
Re[3]: Распаковка gzip и IDataFilter
От:
Аноним
Дата:
23.07.07 15:48
Оценка:
Нельзя ли еще привести пример СompressFile(HANDLE hPlainFile, HANDLE hArchFile) ?
Я таки ж не пониманимаю, что делать с не до конца законченным выходным буфером. Если я пакую большой файл частями: читаю данные во входной буфер, делаю Encode, вижу, что в выходном буфере есть данные для записи, пишу их в файл, читаю во входной буфер еще раз и тут вопрос — как мне вызывать метод Encode, чтобы он продолжил паковать к уже накопленным данным? Сдвигать, что-ли, начало выходного буфера на еще не занятую область и уменьшать его доступный размер?
Re[4]: Распаковка gzip и IDataFilter
От:
Аноним
Дата:
24.07.07 15:30
Оценка:
Отвечаю себе сам
Оказывается код компрессирования довольно похож.
поставил IE7 вместо IE6 и компрессирование перестало работать. DoEncode возвращает "not implemented". DoDecode работает, по-прежнему. Получается, что MS выкинул компрессирование (платформа WinXP)?