Вопрос по c++, winapi, compression – ZLIB распаковка

0

Я кодировал небольшое приложение, которое должно распаковывать данные, закодированные в формате gzip / deflate.

Чтобы достичь этого, я использую библиотеку ZLIB, используя функцию распаковки.

Проблема в том, что эта функция не работает! Другими словами, данные не являются несжатыми!

Я размещаю здесь код:

int (*decompress)(PBYTE,PULONG,PBYTE,ULONG);

void DecodeData(PBYTE data,ULONG dataSize){
  LoadLibrary("C:\\zlib1.dll");

  decompress=(int(*)(PBYTE,PULONG,PBYTE,ULONG))GetProcAddress(
    GetModuleHandle("zlib1.dll"),"uncompress");

  // Yeah I know the size is hardcoded and it's not right, but it's just a test,
  // so nevermind

  PBYTE decompressedData=(PBYTE)VirtualAlloc(NULL,300,MEM_COMMIT|MEM_RESERVE,
    PAGE_EXECUTE_READWRITE);
  ULONG maxSize=250;

  decompress(decompressedData,&maxSize,data,dataSize);

  MessageBox(0,(char*)decompressedData,0,MB_OK);//MessageBox shows no data, it's blank!
}

GetProcAddress успешно получает указатель на функцию, проблема в том, что функция возвращает NULL (и даже не ошибки, перечисленные в документации по zlib)

Вы не проверяете возвращаемое значениеdecompress, почему бы и нет? Jonathan Wakely
@ Аттила: Значение остается прежним: 250, без изменений ... Ananas
Какова стоимостьmaxSize после вызова декомпрессии? Attila
Почему вы используетеPAGE_EXECUTE_READWRITE? Вы никогда не должны делать страницы исполняемыми, если вы помещаете в них непроверенные данные. Кроме того, зачем загружать библиотеку динамически по жестко заданному пути? Почему бы просто не дать zlib1.lib, чтобы он добавил динамическую таблицу символов в исполняемый файл? datenwolf
@JonathanWakely Я добавил его позже: он возвращает NULL Ananas

Ваш Ответ

2   ответа
5

uncompress() Функция не будет распаковывать данные gzip и, в зависимости от того, что вы подразумеваете под «deflate», может и не распаковывать это.

Существует три возможных формата, к которым вы обращаетесь, это фактические сжатые данные, возможно, с некоторыми короткими заголовками и трейлерами для идентификации потока и предоставления некоторых проверочных данных в конце. Есть необработанные данные, как описаноRFC 1951, Есть zlib-упакованные данные deflate, определенныеRFC 1950, Есть сжатые gzip данные, определенные какRFC 1952.

uncompress() будет распаковывать только дефлированные данные в zlib. Он не будет распаковывать данные в формате gzip или необработанные данные.

Вы не предоставили контекст для того, что вы пытаетесь сделать. Однако, когда вы говорите «gzip / deflate», я могу предположить, что по этой комбинации вы имеете в виду имена опций кодирования содержимого HTTP. В этом случае, из-за неудачного выбора имени, & quot; выкачать & quot; Кодирование содержимого относится к дефлированным данным в zlib, а не к необработанным данным.uncompress() будет распаковывать правильно доставленные HTTP-дефлятированные данные, закодированные с контентом.

Я говорю «правильно доставлено», потому что это может быть не так. Опять же, из-за неудачного выбора имени и неспособности программистов Microsoft фактически прочитать спецификацию HTTP, серверы IIS некорректно доставляли необработанные данные с дефляцией вместо zlib-упакованных данных, когда клиент принимал кодирование контента с дефляцией. Это привело к тому, что клиенты должны либо попытаться декодировать кодирование дефлированного содержимого в обоих направлениях и посмотреть, работает ли один из них, либо лучший подход, который заключается в том, чтобы просто не принимать дефляционное кодирование в первую очередь. Если клиент принимает только кодировку содержимого gzip, тогда проблем нет.

Ты можешь использоватьinflateInit2(), inflate(), а такжеinflateEnd() функции zlib для декодирования любого из упомянутых форматов, то есть gzip-wrapped, zlib-wrapped и raw. Пожалуйста, прочитайте документацию вzlib.h чтобы увидеть как.

Кстати,uncompress() Функция возвращает целое число, а не указатель. Поэтому, когда вы говорите, что функция вернуласьNULL вместо того, что предполагалось, я могу только предположить, что интерфейс к этомуZlib функция не была правильно определена.

-3

но пытается распаковать? Вы получаете адрес "uncompress" рутина !!!

Error: User Rate Limit Exceeded Ananas
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ananas
Error: User Rate Limit Exceeded Ananas

Похожие вопросы