我现在要从内存解压数据,用了一些demo,都不成功,主要存在以下几个问题:
1.因为是网络数据,我可以1K 1K地解压么?
2.因为有些包有几百K,解压后的目标数据怎么去分配大小??
恳请大家帮忙

解决方案 »

  1.   

    gzip
    多少数据开始解压,和你发送端怎么发送有关系,否则数据将无效了。请细想下!
      

  2.   

    解决了:
    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);