概述
基于zlib,写了两个函数,可以压缩和解压gzip格式的char *数据。
main里面进行了一下包装,实现了压缩和解压gzip文件的功能。
linux上的标准gzip程序会将原始文件名记录在gzip文件的起始处,后面的内容则同下面程序的操作结果完全相同。所以标准gzip的压缩结果总是比下面程序的压缩结果多几个字节,不过这几个字节不影响解压。
如果需要成功编译该程序,可能需要修改下面zlib头文件的位置到你的环境中的正确位置。
/*************************************************************************** *
* Copyright (c) 2015 Xxx.com, Inc. All Rights Reserved
*
**************************************************************************/
/**
* @file main.cpp
* @author xxx(com@xxx.com)
* @date 2015/01/07 11:46:57
* @brief
*
**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <zlib.h> // "zlib.h" ?
#define windowBits 15
#define ENABLE_ZLIB_GZIP 32
#define GZIP_ENCODING 16
/**
* @brief
* @param dest_len big enough to hold the result
*/
int decompress (unsigned char *src, size_t src_len, unsigned char *dest, size_t dest_len)
{
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.next_in = src;
strm.avail_in = src_len;
strm.next_out = dest;
strm.avail_out = dest_len;
if (inflateInit2 (& strm, windowBits | ENABLE_ZLIB_GZIP) < 0){
printf("init failedn");
return -1;
}
if (inflate (& strm, Z_NO_FLUSH) < 0){
printf("inflate failed %sn", "");
return -1;
}
inflateEnd (& strm);
return dest_len - strm.avail_out;
}
/**
* @brief
* @param
*/
int compress (unsigned char *src, size_t src_len, unsigned char *dest, size_t dest_len)
{
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
if (deflateInit2 (&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
windowBits | GZIP_ENCODING, 8,
Z_DEFAULT_STRATEGY) < 0){
printf("init failedn");
return -1;
}
strm.next_in = src;
strm.avail_in = src_len;
strm.avail_out = dest_len;
strm.next_out = dest;
if (deflate (& strm, Z_FINISH) < 0){
printf("deflate failedn");
return -1;
}
deflateEnd (& strm);
return dest_len - strm.avail_out;
}
int main(int argc, char *argv[])
{
if (argc != 4) {
printf("format errorntformat: %s [d|c] inputfile outputfilentuse 'd' for decompress, 'c' for compressn", argv[0]);
return -1;
}
// get input & output file name
const char * input_file_name = argv[2];
const char * output_file_name = argv[3];
// open input file, and get the size of the file
FILE * fp = fopen (input_file_name, "rb");
if (!fp){
printf("open file failedn");
return -1;
}
fseek(fp, 0, SEEK_END);
int file_len = ftell(fp);
printf("file len %dn", file_len);
fseek(fp, 0, SEEK_SET);
// allocate enough memory to hold the input file
unsigned char *src;
src = (unsigned char*)malloc(file_len);
// load the input file
int bytes_read = fread (src, 1, file_len, fp);
fclose(fp);
if (bytes_read != file_len){
printf("read file error[%d != %d]n", bytes_read, file_len);
free(src);
return -1;
}
// allocate enough memory to hold the result
int dest_len;
if (argv[1][0] == 'd'){
dest_len = file_len * 10;
}else{
dest_len = file_len;
}
unsigned char *dest;
dest = (unsigned char*)malloc(dest_len);
// do the work
int size;
if (argv[1][0] == 'd'){
size = decompress(src, file_len, dest, dest_len);
}else{
size = compress(src, file_len, dest, dest_len);
}
// save the result to the given output file
printf("out len %dn", size);
if (size > 0){
fp = fopen(output_file_name, "wb");
fwrite(dest, 1, size, fp);
fclose(fp);
}else{
printf("operation failed[code = %d]n", size);
}
// free resources
free(src);
free(dest);
return 0;
}
/* vim: set expandtab ts=4 sw=4 sts=4 tw=100: */
最后
以上就是满意月饼为你收集整理的使用zlib压缩和解压gzip的全部内容,希望文章能够帮你解决使用zlib压缩和解压gzip所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复