准备写个小说阅读器可以阅读 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语言源码
分享到:
相关推荐
Zlib压缩解压工具是一款基于Zlib库的实用程序,用于对数据进行高效压缩和解压缩。Zlib是由Jean-loup Gailly和Mark Adler开发的开源库,它广泛应用于各种软件开发,尤其是在网络传输和文件存储方面。该工具特别适合...
Zlib是一个广泛使用的数据压缩库,它包含了多种压缩和解压缩算法,包括DEFLATE,这是ZIP文件格式中常用的一种。Qt为了方便开发者,已经集成了zlib的功能,使得在Qt应用程序中解压ZIP文件变得简单易行。 首先,我们...
描述中提到的"**使用zlib库压缩和解压文件vs2012编译通过,windows下包含了库文件vs2012 win10下**",意味着开发者已经成功地在VS2012环境中配置了zlib库,并且能够在Windows 10上运行相关的C++程序。 标签"**vc**...
通过以上分析,我们了解了如何使用`zlib`库来进行HTTP响应体的gzip数据解压。此过程涉及到文件读写、压缩与解压函数的应用以及错误处理等多个方面。掌握了这些知识点,开发者就能够更加熟练地利用`zlib`库来处理实际...
数据压缩与解压库Zlib是计算机科学领域中一个重要的工具,主要用于数据的压缩和解压缩。这个库广泛应用于各种软件开发中,特别是在网络传输、文件存储和操作系统中,因为压缩数据可以有效地节省存储空间和提高传输...
在IT行业中,压缩和解压技术是数据存储和传输中不可或缺的一部分。Zlib是一个流行的开源库,被广泛用于实现数据压缩和解压缩功能。本文将详细介绍Zlib库以及如何使用易语言结合Zlib模块来实现文件和数据的压缩与解...
- ZIP文件:许多ZIP解压缩工具都使用zlib来解压DEFLATE压缩的数据。ZIP文件格式允许包含多个压缩或未压缩的文件,zlib可以处理其中的压缩部分。 - GZIP文件:GZIP是一种使用DEFLATE算法的单文件压缩格式,通常用于...
在本文中,我们将深入探讨如何使用C++与Zlib库来解压ZIP文件。Zlib是一个广泛使用的开源库,主要用于数据压缩和解压缩,而C++作为强大的编程语言,是实现这一功能的理想选择。我们将主要关注以下几个方面: 1. **...
本项目“C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序”正是利用了ZLIB库来实现这个功能。 ZLIB库是基于DEFLATE算法的,这是一种混合了LZ77(一种字典压缩方法)和霍夫曼编码(一种熵编码方法)的高效压缩...
java解压zlib和压缩zlib的jar
该案例通过zlib实现gzip的压缩解压功能,包括解压gzip字符串、图片两个案例;提供了zlib1211的源码包和对应编译后生成的文件; 相应说明参考笔者博客:Qt笔记8--zlib实现gzip解压,链接...
4. **解压缩文件数据**:有了这些信息,你可以跳转到每个文件的数据部分,使用zlib库提供的函数(如`uncompress`)对数据进行解压缩。 5. **写入解压后的文件**:最后,将解压后的内容写入到目标文件,通常在磁盘上...
zlib库的使用,可以压缩和解压文件夹。 压缩: CreateDirFromZip("test\\example2", "test\\example.zip"); 解压: CreateZipFromDir("test\\example", "test\\example.zip");
本篇文章将深入探讨`ZipArchive`源码中涉及的核心概念、工作原理以及如何使用`zlib`进行文件数据流的压缩与解压。 首先,`ZipArchive`库主要实现了ZIP文件格式的标准,这是一种广泛使用的文件归档格式,支持多文件...
这个代码MFC工程应用是自己写的,文件夹压缩与解压LIB主要是根据:csdn论坛的itloverwm 的资源使用ZLIB库压缩解压源码(支持多级文件夹压缩和解压),地址是:http://download.csdn.net/detail/itloverwm/3928457 上...
2. **解压缩函数**:`CUnzip`类中会有一个`UnzipFile`函数,接收压缩文件路径和目标解压目录作为参数,使用Zlib库的`inflateInit2`、`inflate`和`inflateEnd`等函数来解压缩文件。 3. **处理解压缩过程**:解压缩...
在描述中提到的"解压用zlib压缩的内存数据",是指将已经使用`zlib`压缩过的数据块从内存中读取,然后利用`zlib`库提供的API进行解压缩,还原成原始的数据。这个过程涉及到的主要函数有`inflateInit2()`、`inflate()`...
在这个“QT4.7 + ZLIB压缩解压测试工程”中,开发者可能创建了一个实例,演示了如何在QT4.7环境下集成和使用ZLIB库进行文件或数据的压缩与解压。以下是这个项目可能涉及的关键知识点: 1. **ZLIB库的集成**:首先,...
zlib是一个广泛使用的开源压缩库,由Jean-loup Gailly和Mark Adler开发。它主要用于数据压缩,特别是在网络传输和文件存储中。zlib库支持DEFLATE压缩算法,这是一种结合了LZ77(Lempel-Ziv)和霍夫曼编码(Huffman ...
Zlib库是一个广泛使用的开源库,专门用于数据压缩和解压缩操作。本文将深入探讨如何利用Zlib库在内存中进行压缩和解压操作,以及如何在不同的操作系统环境下进行编译。 首先,Zlib库是由Jean-loup Gailly和Mark ...