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文档中列出的错误)
该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函数的接口.
| 归档时间: |
|
| 查看次数: |
5083 次 |
| 最近记录: |