📄 unixdecodertool.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 + -