用C语言简单演示如何借助zlib库实现文件的压缩和解压缩

Python010

用C语言简单演示如何借助zlib库实现文件的压缩和解压缩,第1张

问题的根源在于这些网友对于字符串和字节流的概念非常的模糊,对文本文件和二进制文件的区别常常模棱两可,其实字节流可以表示所有的数据,二进制文件才是任何文件的本质。字节流是一个字节接一个字节,并没有结束符号,所以需要给它一个长度信息。二进制文件是一个字节接一个字节,并没有换行符之类的。文件压缩的时候,可以通过源文件的长度自动计算缓冲区的长度,压缩后写入目标文件之前,需先保留源文件和目标数据的长度作为解压缩的依据,参考如下代码:#include #include #include int main(int argc, char* argv[]) { FILE* fileuLong flenunsigned char* fbuf = NULLuLong clenunsigned char* cbuf = NULL/* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */ if(argc <3) { printf("Usage: zcdemo srcfile dstfile\n")return -1} if((file = fopen(argv[1], "rb")) == NULL) { printf("Can\'t open %s!\n", argv[1])return -1} /* 装载源文件数据到缓冲区 */ fseek(file, 0L, SEEK_END)/* 跳到文件末尾 */ flen = ftell(file)/* 获取文件长度 */ fseek(file, 0L, SEEK_SET)if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL) { printf("No enough memory!\n")fclose(file)return -1} fread(fbuf, sizeof(unsigned char), flen, file)/* 压缩数据 */ clen = compressBound(flen)if((cbuf = (unsigned char*)malloc(sizeof(unsigned char) * clen)) == NULL) { printf("No enough memory!\n")fclose(file)return -1} if(compress(cbuf, &clen, fbuf, flen) != Z_OK) { printf("Compress %s failed!\n", argv[1])return -1} fclose(file)if((file = fopen(argv[2], "wb")) == NULL) { printf("Can\'t create %s!\n", argv[2])return -1} /* 保存压缩后的数据到目标文件 */ fwrite(&flen, sizeof(uLong), 1, file)/* 写入源文件长度 */ fwrite(&clen, sizeof(uLong), 1, file)/* 写入目标数据长度 */ fwrite(cbuf, sizeof(unsigned char), clen, file)fclose(file)free(fbuf)free(cbuf)return 0}文件解压缩的时候,可以通过保留信息得到缓冲区和数据流的大小,这样解压缩后直接保存即可,参考如下代码:#include #include #include int main(int argc, char* argv[]) { FILE* fileuLong flenunsigned char* fbuf = NULLuLong ulenunsigned char* ubuf = NULL/* 通过命令行参数将srcfile文件的数据解压缩后存放到dstfile文件中 */ if(argc <3) { printf("Usage: zudemo srcfile dstfile\n")return -1} if((file = fopen(argv[1], "rb")) == NULL) { printf("Can\'t open %s!\n", argv[1])return -1} /* 装载源文件数据到缓冲区 */ fread(&ulen, sizeof(uLong), 1, file)/* 获取缓冲区大小 */ fread(&flen, sizeof(uLong), 1, file)/* 获取数据流大小 */ if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL) { printf("No enough memory!\n")fclose(file)return -1} fread(fbuf, sizeof(unsigned char), flen, file)/* 解压缩数据 */ if((ubuf = (unsigned char*)malloc(sizeof(unsigned char) * ulen)) == NULL) { printf("No enough memory!\n")fclose(file)return -1} if(uncompress(ubuf, &ulen, fbuf, flen) != Z_OK) { printf("Uncompress %s failed!\n", argv[1])return -1} fclose(file)if((file = fopen(argv[2], "wb")) == NULL) { printf("Can\'t create %s!\n", argv[2])return -1} /* 保存解压缩后的数据到目标文件 */ fwrite(ubuf, sizeof(unsigned char), ulen, file)fclose(file)free(fbuf)free(ubuf)return 0}

1、首先,需要利用C语言的宏。

2、其次,将一些常见的英文表达。

3、然后,通过define,转化为中文。压缩包就是将初始文件经过压缩形成的文件,压缩文件内存更小,可以将多个文件压缩成一个文件。