ZLIB uncompress

ZLIB uncompress

本文关键字:uncompress ZLIB      更新时间:2023-10-16

我已经编写了一个小型应用程序,该应用程序应该解压缩以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 文档中列出的错误)

uncompress()函数不会解压缩 gzip 数据,并且根据您所说的"压缩"是什么意思,它也可能不会解压缩它。

您指的是三种可能的格式,即实际的压缩数据,可能带有一些短标头和尾部,以标识流并在末尾提供一些检查数据。 有原始的放气数据,如 RFC 1951 所述。 有 RFC 1950 定义的 zlib 包装的 deflate 数据。 有 gzip 包装的 deflate 数据,由 RFC 1952 定义。

uncompress()只会解压缩 zlib 包装的 deflate 数据。 它不会解压缩 gzip 包装的数据或原始压缩数据。

您没有提供要执行的操作的上下文。 但是,当您说"gzip/deflate"时,我可能会猜测您指的是HTTP内容编码选项的名称。 在这种情况下,由于不幸的名称选择,"deflate"内容编码指的是zlib包装的deflate数据,而不是原始数据。 uncompress()将解压缩正确交付的 HTTP 压缩内容编码数据。

我说"正确交付",因为它可能不是。 同样,由于不幸的名称选择,以及Microsoft程序员无法实际读取HTTP规范,当客户端接受deflate内容编码时,IIS服务器将错误地提供原始的deflate数据而不是zlib包装的数据。 这导致客户必须尝试两种方式解码放气内容编码,看看其中一种是否有效,或者更好的方法是首先不接受放气编码。 如果客户端只接受 gzip 内容编码,则没有问题。

您可以使用 zlib 的inflateInit2()inflate()inflateEnd() 函数来解码提到的任何格式,即 gzip 包装、zlib 包装和原始格式。 请阅读 zlib.h 中的文档以了解操作方法。

顺便说一下,uncompress()函数返回一个整数,而不是指针。 因此,当您说该函数返回NULL而不是它应该返回的内容时,我只能假设该 zlib 函数的接口未正确定义。

为什么在你的 GetProcAddress 中使用"解压缩",但尝试解压缩?您获得"解压缩"例程的地址!!