提取gz文件中的压缩部分数据,C语言实现
2012-08-07 15:02
375 查看
gz文件是gzip产生的压缩文件。前几天接到一个小任务,说是要将其中被压缩的数据提取出来。于是动手写了个小程序实现之。
关于gzip文件格式的相关信息,可以查看RFC 1952
代码如下:
关于gzip文件格式的相关信息,可以查看RFC 1952
代码如下:
#include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> int main(int argc,char* argv[]) { FILE* sfp=NULL; FILE* dfp=NULL; int readnum; int count=0; /*for tail cross two bufs*/ unsigned char uc_magic; unsigned char uc_temp; int FLG_FEXTRA_SET=0; int FLG_FNAME_SET=0; int FLG_FCOMMENT_SET=0; int FLG_FHCRC_SET=0; unsigned int xlen=0; unsigned char buf[4096]=""; unsigned char buf2[4096]=""; unsigned char result[4096]=""; if(argc<2) { printf("usage main your gz file\n"); return(0); } sfp=fopen(argv[1],"rb"); if(sfp==NULL) { printf("open file error! errmsg:%s\n",strerror(errno)); return(0); } dfp=fopen("result","wb+"); /*check file magic number*/ uc_magic=fgetc(sfp); if(uc_magic!=0x1f) { printf("error this is not a gz file!\n"); fclose(sfp); fclose(dfp); return(0); } uc_magic=fgetc(sfp); if(uc_magic!=0x8b) { printf("error this is not a gz file!\n"); fclose(sfp); fclose(dfp); return(0); } /*ignore the CM byte*/ fseek(sfp,1,SEEK_CUR); /*read FLG*/ uc_temp=fgetc(sfp); if(uc_temp==EOF) { printf("end of file when read FLG\n"); fclose(sfp); fclose(dfp); return(0); } /*check FLG.FEXTRA*/ if(uc_temp&0x04) { FLG_FEXTRA_SET=1; } /*check FLG.FNAME*/ if(uc_temp&0x08) { FLG_FNAME_SET=1; } /*check FLG.FCOMMENT*/ if(uc_temp&0x10) { FLG_FCOMMENT_SET=1; } /*skip MIME 4 bytes,skip XFL 1 byte, skip OS 1 byte */ fseek(sfp,6,SEEK_CUR); /*FLG.FEXTRA is seted */ if(FLG_FEXTRA_SET) { /*skip s1 and s2 read XLEN,and skip XLEN byte*/ fseek(sfp,2,SEEK_CUR); fread(&xlen,2,1,sfp); fseek(sfp,xlen,SEEK_CUR); } /*FLG.FNAME is seted*/ if(FLG_FNAME_SET) { /*ignore file name,read until 0 occur*/ while(fgetc(sfp)); } /*FLG.FCOMMENT is seted*/ if(FLG_FCOMMENT_SET) { /*ignore comments,read until 0 occur*/ while(fgetc(sfp)); } /*FLG.FHCRC is seted*/ if(FLG_FHCRC_SET) { fseek(sfp,2,SEEK_CUR); } /*fread return 0 when content length is not engouh*/ while((readnum=fread(buf,1,4096,sfp))!=0) { if(feof(sfp)) { /* EOF cut CRC32 and ISIZE 8 bytes*/ /* be care when the tail cross two buf~~~~*/ if(readnum<8) { /* tail does cross two buf~~hell!!*/ memcpy(buf,buf2,count-(8-readnum)); memcpy(result,buf,count-(8-readnum)); fwrite(result,count-(8-readnum),1,dfp); break; } else { if(count!=0) { memcpy(result,buf2,count); fwrite(result,count,1,dfp); } memcpy(result,buf,readnum-8); fwrite(result,readnum-8,1,dfp); break; } } else { if(count!=0) { memcpy(result,buf2,count); fwrite(result,count,1,dfp); memcpy(buf2,buf,readnum); count=readnum; } else { memcpy(buf2,buf,readnum); count=readnum; } } } fclose(sfp); fflush(dfp); fclose(dfp); return(0); }
相关文章推荐
- 用C语言简单演示如何借助zlib库实现文件的压缩和解压缩
- 基于Zlib实现的从ZIP文件中提取文件数据
- 数据挖掘之文本特征提取【理论+部分java代码实现】
- 数据的压缩存储与解压缩算法实现(C语言)
- 数据压缩实验三:用c语言实现Huffman编码和压缩效率分析
- SYD8801批量烧录说明【缩写词解析】【烧录原理】【硬件支持】【工具】【第一部分:提取文件】【第二部分:制作批量烧录工具】【保存当前设置为默认设置】【 预计烧录时间】【带24KFLASH数据的批量】
- 串口传文件(非终端串口,自己定协议下位机部分C语言实现)
- 数据的压缩存储与解压缩算法实现(C语言)
- 数据压缩第二次实验报告——用C语言实现bmp to yuv的图片格式转化
- 【转载】MP4文件数据结构以及提取部分信息的代码
- 数据的压缩存储与解压缩算法实现(C语言)
- 分配input port buffers、提取视频文件压缩数据、复制压缩数据到input buffer、H.264硬件解码器开始解码过程分析
- GTK+和C语言实现的哈夫曼文件压缩工具
- c语言实现两个文件内数据相加
- Java实现将多个文件打包压缩成tar.gz文件
- HOG特征提取代码(opencv处理基本数据,c语言实现基本算法)
- c语言实现把文件中数据读取并存到数组中
- C++实现文件数据提取
- 在没有备份的情况下通过rowid提取数据文件损坏的表空间中的部分数据
- HOG特征提取代码(opencv处理基本数据,c语言实现基本算法)