MTK的工程使用的是07B的,如果是其他工程的话,应该是需要适配一下的。
还需要说明的是我在.gz的开头分配了4字节用来保存原始文件的大小。看代码应该就知道了。
void zlibEnter()
{
appzlib_register(malloc,free);
zlibuncompress();
}
void zlibuncompress()
{
char *compr, *uncompr,*comprlen;
unsigned long comprLen, uncomprLen;
FILE *fpin, *fpout;
int file_len_dest,src_len_src = 0;
int wsize = 0;
int err;
fpin = fopen("C:\\a.gz", "rb"); //读取压缩文件
fpout = fopen("C:\\a_dest.txt", "wb");//将压缩内容输出到此文件
if(fpin && fpout)
{
fseek(fpin, 4, SEEK_END);
file_len_dest = ftell(fpin); //得到压缩文件大小
fseek(fpin, 0, SEEK_SET);
if(file_len_dest > 0)
{
comprlen = malloc(sizeof(file_len_dest)); //分配读取前4字节原始文件长度的缓存区
compr = malloc((uInt)file_len_dest); //分配读取压缩文件缓存区
if (compr == Z_NULL || uncompr == Z_NULL)
{
fprintf(stderr, "内存分配失败\n");
return 1;
}
fread(comprlen, 4, 1, fpin);//读取前4字节原始文件长度
src_len_src = *((int *)comprlen);
uncompr = malloc((uInt)src_len_src);//分配读取解压后写入文件的缓存区
fseek(fpin, 4, SEEK_SET);//设置从4字节之后读
fread(compr, file_len_dest, 1, fpin);//读取压缩文件内容
err = uncompress(uncompr, &uncomprLen, compr, comprLen);//解压
if (err != Z_OK)
{
fprintf(stderr, "解压错误\n");
}
else
{
wsize = fwrite(uncompr,src_len_src,1,fpout);//将解压之后的内容写入指定文件
}
fclose(fpin);
fclose(fpout);
free(compr);
free(comprlen);
free(uncompr);
}
else
{
fprintf(stderr, "输入文件长度为0");
}
}
else
{
printf("打开文件出错\n");
}
}
参考了网络上部分代码,已经验证,能正常进行解压。