`
enefry
  • 浏览: 36598 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android 用zlib 解压数据段

阅读更多

准备写个小说阅读器可以阅读 txt/umd 格式的小说. umd 文件解码想用ndk 用C实现.umd文件格式网上有很多..

由于Umd文件正文部分是用zip压缩的.但是又没有记录解压后的长度.

这样如果使用zlib.h文件中 uncompress方法,需要足够长的空间容纳解压数据,不然就会出错了.郁闷

而且uncompressed又没有compress那样的compressBound 的函数可以使用.

 

看了下源码中的 zpipe.c 感觉还是可以改改的.

 

struct Output {
 //解压后的缓存
 char *destBuf;
 char *destPos;
 //解压后缓存大小
 int destLen;
 //解压缓存最大容量
 int destSize;
} Output;
typedef struct Output Z_out;

 


int uncompress2(char *src, int srcLen, Z_out &output) {
 int ret;
 z_stream strm;

 /* 解压状态初始化 */
 strm.zalloc = Z_NULL;
 strm.zfree = Z_NULL;
 strm.opaque = Z_NULL;
 strm.avail_in = 0;
 strm.next_in = Z_NULL;
 ret = inflateInit(&strm);
 if (ret != Z_OK) {
  return ret;
 }
 strm.avail_in = srcLen;
 strm.next_in = (Bytef*)src;

 

//如果原来没有可用的解压空间
 if (!output.destSize) { 
  output.destSize = srcLen;
  output.destBuf = (char*) malloc(srcLen);
 }
 output.destPos = output.destBuf;
 output.destLen = 0;

//循环取出所有内容
 do {
  strm.avail_out = output.destSize - output.destLen;
  strm.next_out = (Bytef*)output.destPos;
  ret = inflate(&strm, Z_NO_FLUSH);
  assert(ret != Z_STREAM_ERROR);

//出错状态:
  switch (ret) {
  case Z_NEED_DICT:
   ret = Z_DATA_ERROR; /* and fall through */
  case Z_DATA_ERROR:
  case Z_MEM_ERROR:
   (void) inflateEnd(&strm);
   return ret;
  }


  output.destLen = output.destSize - strm.avail_out;
  //解压未结束: 存储空间不足
  if (ret != Z_STREAM_END) {
   //存储翻倍
   output.destSize <<= 1;
   //重新申请内存  .... 使用 realloc的缺陷自己解决吧..
   output.destBuf = (char*) realloc(output.destBuf, output.destSize);
   //位置设定
   output.destPos = output.destBuf + output.destLen;
  }
 } while (ret != Z_STREAM_END);
 (void) inflateEnd(&strm);
 return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}

 

如有不妥请多多指教.

 

顺便有 zlib 的c语言源码

 

0
6
分享到:
评论

相关推荐

    Zlib压缩解压工具

    Zlib压缩解压工具是一款基于Zlib库的实用程序,用于对数据进行高效压缩和解压缩。Zlib是由Jean-loup Gailly和Mark Adler开发的开源库,它广泛应用于各种软件开发,尤其是在网络传输和文件存储方面。该工具特别适合...

    C++ 使用zlib压缩和解压文件

    描述中提到的"**使用zlib库压缩和解压文件vs2012编译通过,windows下包含了库文件vs2012 win10下**",意味着开发者已经成功地在VS2012环境中配置了zlib库,并且能够在Windows 10上运行相关的C++程序。 标签"**vc**...

    Qt使用自带zlib解压zip文件示例

    Zlib是一个广泛使用的数据压缩库,它包含了多种压缩和解压缩算法,包括DEFLATE,这是ZIP文件格式中常用的一种。Qt为了方便开发者,已经集成了zlib的功能,使得在Qt应用程序中解压ZIP文件变得简单易行。 首先,我们...

    zlib解压http的gzip数据

    通过以上分析,我们了解了如何使用`zlib`库来进行HTTP响应体的gzip数据解压。此过程涉及到文件读写、压缩与解压函数的应用以及错误处理等多个方面。掌握了这些知识点,开发者就能够更加熟练地利用`zlib`库来处理实际...

    数据压缩与解压库zlib

    数据压缩与解压库Zlib是计算机科学领域中一个重要的工具,主要用于数据的压缩和解压缩。这个库广泛应用于各种软件开发中,特别是在网络传输、文件存储和操作系统中,因为压缩数据可以有效地节省存储空间和提高传输...

    zlib文件解压可用版

    - ZIP文件:许多ZIP解压缩工具都使用zlib来解压DEFLATE压缩的数据。ZIP文件格式允许包含多个压缩或未压缩的文件,zlib可以处理其中的压缩部分。 - GZIP文件:GZIP是一种使用DEFLATE算法的单文件压缩格式,通常用于...

    C++ Zlib解压zip文件Demo

    在本文中,我们将深入探讨如何使用C++与Zlib库来解压ZIP文件。Zlib是一个广泛使用的开源库,主要用于数据压缩和解压缩,而C++作为强大的编程语言,是实现这一功能的理想选择。我们将主要关注以下几个方面: 1. **...

    C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序.zip

    本项目“C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序”正是利用了ZLIB库来实现这个功能。 ZLIB库是基于DEFLATE算法的,这是一种混合了LZ77(一种字典压缩方法)和霍夫曼编码(一种熵编码方法)的高效压缩...

    java解压zlib和压缩zlib的jar

    java解压zlib和压缩zlib的jar

    Qt之zlib库实现gzip压缩解压源码

    该案例通过zlib实现gzip的压缩解压功能,包括解压gzip字符串、图片两个案例;提供了zlib1211的源码包和对应编译后生成的文件; 相应说明参考笔者博客:Qt笔记8--zlib实现gzip解压,链接...

    易语言zlib 压缩解压代码 +模块

    在IT行业中,压缩和解压技术是数据存储和传输中不可或缺的一部分。Zlib是一个流行的开源库,被广泛用于实现数据压缩和解压缩功能。本文将详细介绍Zlib库以及如何使用易语言结合Zlib模块来实现文件和数据的压缩与解...

    C++语言用zlib库解压zip文件

    4. **解压缩文件数据**:有了这些信息,你可以跳转到每个文件的数据部分,使用zlib库提供的函数(如`uncompress`)对数据进行解压缩。 5. **写入解压后的文件**:最后,将解压后的内容写入到目标文件,通常在磁盘上...

    zlib库的使用,可以压缩和解压文件夹.zip

    zlib库的使用,可以压缩和解压文件夹。 压缩: CreateDirFromZip("test\\example2", "test\\example.zip"); 解压: CreateZipFromDir("test\\example", "test\\example.zip");

    ZipArchive源码 使用zlib压缩解压文件数据流

    本篇文章将深入探讨`ZipArchive`源码中涉及的核心概念、工作原理以及如何使用`zlib`进行文件数据流的压缩与解压。 首先,`ZipArchive`库主要实现了ZIP文件格式的标准,这是一种广泛使用的文件归档格式,支持多文件...

    VC使用ZLIB压缩解压多级文件夹

    这个代码MFC工程应用是自己写的,文件夹压缩与解压LIB主要是根据:csdn论坛的itloverwm 的资源使用ZLIB库压缩解压源码(支持多级文件夹压缩和解压),地址是:http://download.csdn.net/detail/itloverwm/3928457 上...

    MFC Zlib 解压和压缩简单文件夹 亲测可用 简单类

    2. **解压缩函数**:`CUnzip`类中会有一个`UnzipFile`函数,接收压缩文件路径和目标解压目录作为参数,使用Zlib库的`inflateInit2`、`inflate`和`inflateEnd`等函数来解压缩文件。 3. **处理解压缩过程**:解压缩...

    zlib内存解压代码

    在描述中提到的"解压用zlib压缩的内存数据",是指将已经使用`zlib`压缩过的数据块从内存中读取,然后利用`zlib`库提供的API进行解压缩,还原成原始的数据。这个过程涉及到的主要函数有`inflateInit2()`、`inflate()`...

    QT4.7 + ZLIB压缩解压测试工程

    在这个“QT4.7 + ZLIB压缩解压测试工程”中,开发者可能创建了一个实例,演示了如何在QT4.7环境下集成和使用ZLIB库进行文件或数据的压缩与解压。以下是这个项目可能涉及的关键知识点: 1. **ZLIB库的集成**:首先,...

    zlib的windows端应用工具

    zlib是一个广泛使用的开源压缩库,由Jean-loup Gailly和Mark Adler开发。它主要用于数据压缩,特别是在网络传输和文件存储中。zlib库支持DEFLATE压缩算法,这是一种结合了LZ77(Lempel-Ziv)和霍夫曼编码(Huffman ...

    zlib内存压缩和解压操作demo

    Zlib库是一个广泛使用的开源库,专门用于数据压缩和解压缩操作。本文将深入探讨如何利用Zlib库在内存中进行压缩和解压操作,以及如何在不同的操作系统环境下进行编译。 首先,Zlib库是由Jean-loup Gailly和Mark ...

Global site tag (gtag.js) - Google Analytics