📄 gztool.cpp
字号:
#include "stdafx.h"
#include "GzTool.h"
#include "zlib/zlib.h"
struct GzHeader
{
BYTE Magic[2]; // 0x1f, 0x8b
BYTE Method; // deflate:0x08 , 懠偼梊栺
BYTE Flag; // bit0:Text
// bit1:No2 or 3 or... of MultiPartGzip
// bit2:摿暿側椞堟偑懚嵼
// bit3:僼傽僀儖柤偑懚嵼
// bit4:僐儊儞僩偑懚嵼
// bit5:僼傽僀儖偼埫崋壔偝傟偰偄傞
DWORD Update; // 嵟廔峏怴擔帪丅Unix宍幃丅
BYTE ExFlag; // 奼挘僼儔僌
BYTE OSType; // 僼傽僀儖傪嶌惉偟偨OS偺庬椶(徻嵶棯)
// 7:bit1偑僙僢僩偝傟偰偄傞偲偒丄僷乕僩斣崋(0,1,2,...) 2byte枖偼側偟
// 8:bit2偑僙僢僩偝傟偰偄傞偲偒丄摿暿側椞堟偺挿偝 2byte枖偼側偟
// 9:摿暿側椞堟 ?byte枖偼側偟
// 10:bit3偑僙僢僩偝傟偰偄傞偲偒丄尦偺僼傽僀儖柤 ?byte枖偼側偟('\0'偱廔傢傞)
// 11:bit4偑僙僢僩偝傟偰偄傞偲偒丄僐儊儞僩 ?byte枖偼側偟('\0'偱廔傢傞)
// 12:bit5偑僙僢僩偝傟偰偄傞偲偒丄埫崋壔僿僢僟 12byte枖偼側偟
};
// 13:埑弅僨乕僞 ?byte
// 14:32價僢僩CRC 4byte
// 15:僼傽僀儖僒僀僘&0xffffffff 4byte
bool CGzTool::Check( const char* fname, unsigned long fsize )
{
const unsigned char* hdr = CTool::common_buf;
unsigned long siz = (fsize>XACR_BUFSIZE ? XACR_BUFSIZE : fsize);
//--------------------------------------------------------------------//
return ( siz>=10 && hdr[0]==0x1f
&& ( hdr[1]==0x8b || hdr[1]==0x9e ) );
}
bool CGzTool::Extract( const char* fname,const char* ddir )
{
unsigned char* buf = CTool::common_buf;
//--------------------------------------------------------------------//
// 僼傽僀儖柤偑傕偟偁傟偽撉傒崬傒
char outname[MAX_PATH];
FILE* fp = fopen( fname,"rb" );
if( !fp )
return false;
GzHeader head;
if( 10 != fread( &head,1,10,fp ) )
{
fclose(fp);
return false;
}
if( head.Flag&(1<<3) )
{
if( head.Flag&(1<<1) )fgetc(fp),fgetc(fp);
if( head.Flag&(1<<2) )
{WORD splen=0;fread(&splen,2,1,fp);fread(buf,1,splen,fp);}
for( int i=0; i!=65536; i++ )
{
int c=fgetc(fp);
if( c==-1 || c==0 ){buf[i]=0;break;}
buf[i]=c;
}
strncpy( outname,(char*)buf,MAX_PATH );
}
else
{
kiutil::getOriginalName( outname,fname,
// 0==stricmp(kiutil::pathExt(fname),"gz") ? NULL : "ungzip" );
0==strcmp(kiutil::pathExt(fname),"gz") ? NULL : "ungzip" ); //by uema2.
}
fclose( fp );
gzFile gfp=gzopen( fname,"rb" );
if( !gfp )return false;
//by uema2
sprintf(outname, "%s\\%s", ueutil::GetExtractPath(), outname); // by uema2.
FILE* fwp=fopen( outname,"wb" );
if( fwp )
{
size_t s;
while( s=gzread(gfp,buf,XACR_BUFSIZE) )
{
if( s==-1 )
break;
fwrite( buf,1,s,fwp );
}
fclose(fwp);
}
gzclose( gfp );
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -