我现在要从内存解压数据,用了一些demo,都不成功,主要存在以下几个问题:
1.因为是网络数据,我可以1K 1K地解压么?
2.因为有些包有几百K,解压后的目标数据怎么去分配大小??
恳请大家帮忙
1.因为是网络数据,我可以1K 1K地解压么?
2.因为有些包有几百K,解压后的目标数据怎么去分配大小??
恳请大家帮忙
解决方案 »
- WIN32 播放背景音乐
- 急:如何写一个调用MFC的DLL
- 请问有做funambol服务器之间同步的高手不?
- VC+ADO+ACCESS导入导出DBF文件,顶者有分!解决问题马上揭贴!
- 使用ijl将位图数据压缩为jpg出现一个问题(请各位大侠帮忙解决100分奉上)
- 如何用ANIMATE控件显示Gif动画?
- 终于混到一颗星了,撤......
- 很多程序都带有一个或几个.ini文件,是作什么的啊?
- 怎样给窗口加上可改变大小的把手?
- MFC里删除按钮出现问题,请问怎么解决
- 求教 mfc 数据库odbc 查询方面的 问题
- VC中我添加一个ADO连接数据库的累,可是调用这个累的时候怎么老是出现我没有定义这个类呢????
多少数据开始解压,和你发送端怎么发送有关系,否则数据将无效了。请细想下!
int inflate_read(char *source,int len,char **dest,int gzip)
{
int ret;
unsigned have;
z_stream strm;
unsigned char out[1024];
int totalsize = 0; /* allocate inflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL; if(gzip)
ret = inflateInit2(&strm, 47);
else
ret = inflateInit(&strm); if (ret != Z_OK)
return ret; strm.avail_in = len;
strm.next_in = (Bytef *)source; /* run inflate() on input until output buffer not full */
do {
strm.avail_out = 1024;
strm.next_out = out;
ret = inflate(&strm, Z_NO_FLUSH);
assert(ret != Z_STREAM_ERROR); /* state not clobbered */
switch (ret)
{
case Z_NEED_DICT:
ret = Z_DATA_ERROR; /* and fall through */
case Z_DATA_ERROR:
case Z_MEM_ERROR:
inflateEnd(&strm);
return ret;
}
have = 1024 - strm.avail_out;
totalsize += have;
*dest = (char *)realloc(*dest, totalsize);
memcpy(*dest + totalsize - have, out, have);
} while (strm.avail_out == 0); /* clean up and return */
(void)inflateEnd(&strm);
return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}
感谢这个写算法的兄弟,
调用:
char **pDest=NULL; pDest = (char **)calloc(1024, sizeof(char)); inflate_read(m_DataRecv, nMaxLength, pDest, 1); int nLen = strlen(*pDest); fputs(*pDest, pFile);
fflush(pFile);
free(pDest);