ZLIB解压缩

Ana*_*nas 0 c++ compression winapi zlib

我编写了一个小应用程序,它应该解压缩以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!
}
Run Code Online (Sandbox Code Playgroud)

GetProcAddress成功获取了该函数的指针,问题是该函数返回NULL(甚至没有zlib文档中列出的错误)

Mar*_*ler 5

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

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

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

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

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

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

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