ZLIB解压缩

时间:2012-05-27 12:18:41

标签: c++ winapi compression zlib

我编写了一个小应用程序,它应该解压缩以gzip / deflate格式编码的数据。

为了实现这一目标,我使用了ZLIB库,使用了解压缩功能。

问题是该功能不起作用!用orher的话说,数据不是未压缩的!

我在这里发布代码:

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文档中列出的错误)

2 个答案:

答案 0 :(得分:5)

uncompress()函数不会解压缩gzip数据,并且根据“deflate”的含义,它也可能无法解压缩。

您指的是三种可能的格式,即实际压缩数据可能带有一些短标题和预告片来识别流并在最后提供一些检查数据。存在原始收缩数据,如RFC 1951所述。由RFC 1950定义的zlib包装的deflate数据。有gzip包装的deflate数据,由RFC 1952定义。

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

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

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

您可以使用zlib的inflateInit2()inflate()inflateEnd()函数来解码所提到的任何格式,即gzip-wrapped,zlib-wrapped和raw。请阅读zlib.h中的文档,了解具体方法。

顺便说一句,uncompress()函数返回一个整数,而不是一个指针。所以当你说函数返回NULL而不是它应该的时候,我只能假设没有正确定义zlib函数的接口。

答案 1 :(得分:-3)

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