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

📄 unixdecodertool.cpp

📁 一个解压程序,只要设定了解压路径和解压文件的种类,就可以随意解压
💻 CPP
字号:

#include "stdafx.h"
#include "UnixDecoderTool.h"

bool CUnixDecoderTool::Check( const char* fname, unsigned long fsize )
{
	unsigned long siz = (fsize>XACR_BUFSIZE ? XACR_BUFSIZE : fsize);
	const unsigned char *ptr = CTool::common_buf,
						*end = CTool::common_buf + siz - 6;
//--------------------------------------------------------------------//

	// 奼挘巕 uue/xxe 偠傖側偐偭偨傜媝壓
	const char* ext = kiutil::pathExt( fname );
	if( (ext[0]!= x && ext[0]!= X )
	 || (ext[1]!= x && ext[1]!= X )
	 || (ext[2]!='e'&& ext[2]!='E' && ext[2]!=0 ) )
		return false;

	// begin 偱巒傑傞峴偑偁傞偐丠
	bool first=true;
	for( ; ptr<end; ptr++ )
	{
		if( *ptr=='\0' )
			break;
		if( first )
			first=false, ptr--;
		else if( *ptr!='\r' && *ptr!='\n' )
			continue;

		if( ptr[1]=='b' && ptr[2]=='e'
		 && ptr[3]=='g' && ptr[4]=='i' && ptr[5]=='n' )
			return true;
	}
	return false;
}

#define DEC(c) (table[(c)&0x7f])

bool CUnixDecoderTool::Extract( const char* fname,const char* ddir )
{
	char* str=(char*)CTool::common_buf;
//--------------------------------------------------------------------//

	// 僿僢僟傪撉傓
	FILE* fp=fopen(fname,"rb");
	if( !fp ) return false;
	char outname[5000]="";
	char tmpname[5000]="";//by uema2
	while( !feof(fp) )
	{
		kiutil::getline( str,XACR_BUFSIZE,fp );
		if( str==strstr(str,"begin") )
		{
			int dummy;
			sscanf(str,"begin %o %s",&dummy,outname);
			break;
		}
	}
	if( feof(fp) ){fclose(fp);return false;}

	// 弌椡愭僼傽僀儖傪嶌傞
	if( *outname==0 )
	{
		char newext[] = {x,x,'d','e','c','o','d','e'};

		const char* ext = kiutil::pathExt( fname );
		if( (ext[0]!=x && ext[0]!=X)
		 || (ext[1]!=x && ext[1]!=X) )
			kiutil::getOriginalName( outname,fname,newext );
		else
			kiutil::getOriginalName( outname,fname,NULL );
	}
	//by uema2
	sprintf(tmpname, "%s\\%s", ueutil::GetExtractPath(), outname); // by uema2.
	strcpy(outname, tmpname);

	FILE* op=fopen(outname,"wb");
	if( !op ){fclose(fp);return false;}

	// 僨僐乕僪
	InitTable();

	while( !feof(fp) )
	{
		kiutil::getline( str,XACR_BUFSIZE,fp );
		char* p=str;

		int n = DEC(*p);
		if( n==0 )
			break;

		for( ++p; n>0; p+=4,n-=3 )
		{
			fputc( DEC(p[0])<<2 | DEC(p[1])>>4 , op );
			if( n==1 ) continue;
			fputc( DEC(p[1])<<4 | DEC(p[2])>>2 , op );
			if( n==2 ) continue;
			fputc( DEC(p[2])<<6 | DEC(p[3])    , op );
		}
	}

	// 廔椆
	fclose(op);
	fclose(fp);
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -