android zlib解压,android 用zlib 解压数据段

本文探讨了如何使用C语言通过NDK处理UMD文件的解压缩问题,特别是针对ZIP压缩正文部分无法预先得知解压后长度的挑战。作者提出了一种动态调整解压缓冲区大小的解决方案,利用zlib库的inflate函数进行解压,并在内存不足时进行内存翻倍。代码中包含了zlib的zpipe.c的修改思路,旨在确保解压过程的顺利进行。
摘要由CSDN通过智能技术生成

准备写个小说阅读器可以阅读 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语言源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值