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"); } }
参考了网络上部分代码,已经验证,能正常进行解压。