2011-02-04 200 views
4

我是否可以在内存中读取zlib压缩文件而不实际将其提取到磁盘?如果你能提供一个片段,这将是很好的。使用zlib进行内存解压缩

+10

你有没有尝试过你自己呢?只是提示:“请提供代码”是寻求帮助的不好方法。没有人愿意免费为你做你的工作,但人们确实希望帮助你解决一个你无法弄清楚的问题。用这种方式来说出你的问题以获得更好的结果 – 2011-02-04 19:00:05

+5

如果你尝试了一下,你会得到更多的帮助,然后告诉我们你卡在哪里。如果你坚持从哪里开始,你可以在你的问题中指出你正在考虑的一些想法。 – 2011-02-04 19:00:58

+7

这将是很好的工作,而不是你付出代价;) – 2011-02-04 19:03:45

回答

0

是的,你可以; zlib通常用于嵌入式系统中,将应用程序映像从ROM解压缩到RAM中 - 完全是从内存到内存的操作。

zlib文档描述了必要的调用。

15

这里是一个zLib充气例程,它将内存中的缓冲区解压缩到提供的输出缓冲区中。这是一个“一次性”功能,因为它试图一次膨胀整个输入缓冲区,并假定你已经给了它足够的空间来适应所有。也可以根据需要编写一个动态增长目标缓冲区的多镜头功能。

int inflate(const void *src, int srcLen, void *dst, int dstLen) { 
    z_stream strm = {0}; 
    strm.total_in = strm.avail_in = srcLen; 
    strm.total_out = strm.avail_out = dstLen; 
    strm.next_in = (Bytef *) src; 
    strm.next_out = (Bytef *) dst; 

    strm.zalloc = Z_NULL; 
    strm.zfree = Z_NULL; 
    strm.opaque = Z_NULL; 

    int err = -1; 
    int ret = -1; 

    err = inflateInit2(&strm, (15 + 32)); //15 window bits, and the +32 tells zlib to to detect if using gzip or zlib 
    if (err == Z_OK) { 
     err = inflate(&strm, Z_FINISH); 
     if (err == Z_STREAM_END) { 
      ret = strm.total_out; 
     } 
     else { 
      inflateEnd(&strm); 
      return err; 
     } 
    } 
    else { 
     inflateEnd(&strm); 
     return err; 
    } 

    inflateEnd(&strm); 
    return ret; 
} 

说明:

SRC:包含压缩(gzip的或zlib的)数据
srcLen源缓冲区:源缓冲区的长度
DST:目标缓冲区,将输出写入其中
dstLen:目标缓冲区的长度

返回值:

Z_BUF_ERROR:如果dstLen不够大,以适应膨胀数据
Z_MEM_ERROR:如果有足够的内存来执行解压缩
Z_DATA_ERROR:如果输入数据被损坏

否则,返回值是写入dst的字节数。