⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gztool.cpp

📁 一个解压程序,只要设定了解压路径和解压文件的种类,就可以随意解压
💻 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 + -