写了一个UUE编码的类.

前段时间翻了翻以前收集的一些文档,看见了这个东西,于是想写个类封装一下. 

这个东西在电子邮件中用的比较多,详细的情况自己搜索一下吧.

头文件部分:

 

/*--------------------------------------------------------------------------------*/


// 定义一些额外的信息,保存这些信息到文件中可以用winrar打开
#define  BEGIN_FLAG           "begin "
#define  END_FLAG             "' end"
#define  DEFAULT_ID           "777"
#define  DEFAULT_FILE_NAME    "UueEncodeFile.txt"
enum  UueOutMode  {out_str,out_file} ;

class  CUuencode
{
public:
    CUuencode(
/*UueOutMode Mode*/);
    
void SetFileModeInf(unsigned char* filename=(unsigned char*)DEFAULT_FILE_NAME,unsigned char* ID=(unsigned char*)DEFAULT_ID);
public:
    
~CUuencode(void);
public:
    
void unUueChar (unsigned char chuue[4],unsigned char chasc[3]);
    
void UueChar   (unsigned char chasc[3],unsigned char chuue[4]);
    DWORD UueStr (
const unsigned char ascstr[],size_t asclen,unsigned char uuestr[],size_t &uuelen,UueOutMode mode=out_str);
    size_t GetUueStrDataLen(
const unsigned char uuestr[]);
    DWORD UnUueStr(
const unsigned char uuestr[],size_t uuelen,unsigned char ascstr[],size_t &asclen,UueOutMode &mode);
private:
    UueOutMode FMode;
    unsigned 
char *  FID;
    unsigned 
char *  FileName;
    size_t     IDlen;
    size_t     namelen;
    unsigned 
char * beginFlag;
    unsigned 
char * endFlag;
}
;

 

解码的那部分未贴出来,因为当输入的字符为非uue编码时有可能会溢出,打算先考虑一下如何判断输入的为非UUE编码,或者错误的编码.

实现:

 

/*------------------------------------------------*
 *                                                  *
 *                 Uue字符编码                    *
 *                 2007-3-16                      *
 *                                                  *
*------------------------------------------------
*/


CUuencode::CUuencode(
/*UueOutMode Mode=out_str*/ )
{
    beginFlag
=(unsigned char*)BEGIN_FLAG;
    endFlag
=  (unsigned char*)END_FLAG;
}

void  CUuencode::SetFileModeInf(unsigned  char *  filename,unsigned  char *  ID)
{
    
    FID
=ID;
    FileName
=filename;
    IDlen
=_mbslen(FID);
    namelen
=_mbslen(filename);
    
if(IDlen==0)
    
{
        _mbscpy(FID,(unsigned 
char*)DEFAULT_ID);
        IDlen
=_mbslen(FID);
    }

    
if(namelen==0)
    
{
        _mbscpy(FileName,(unsigned 
char*)DEFAULT_ID);
        namelen
=_mbslen((unsigned char*)DEFAULT_FILE_NAME);
    }

}

CUuencode::
~ CUuencode()
{
    
//
}

/*Uuencode编码*/
/*
chasc:未编码的二进制代码
chuue:编码过的Uue代码
*/

void  CUuencode::UueChar(unsigned  char  chasc[ 3 ],unsigned  char  chuue[ 4 ])
{
    
int i,k=2;
    unsigned 
char t=NULL;
    
for(i=0;i<3;i++)
    
{
        
*(chuue+i)=*(chasc+i)>>k;
        
*(chuue+i)|=t;
        
if(*(chuue+i)==NULL) 
            
*(chuue+i)+=96;
        
else 
            
*(chuue+i)+=32;
        t
=*(chasc+i)<<(8-k);
        t
>>=2;
        k
+=2;
    }

    
*(chuue+3)=*(chasc+2)&63;
    
if(*(chuue+3)==NULL) 
        
*(chuue+3)+=96;
    
else 
        
*(chuue+3)+=32;
}
 

/*Uuencode解码*/
/*
chuue:未解码的Uue代码
chasc:解码过的二进制代码
*/

void  CUuencode::unUueChar(unsigned  char  chuue[ 4 ],unsigned  char  chasc[ 3 ])
{
    
int i,k=2;
    unsigned 
char t=NULL;
    
if(*chuue==96
        
*chuue=NULL;
    
else 
        
*chuue-=32;
    
for(i=0;i<3;i++)
    
{
        
*(chasc+i)=*(chuue+i)<<k;
        k
+=2;
        
if(*(chuue+i+1)==96*(chuue+i+1)=NULL;
        
else *(chuue+i+1)-=32;
        t
=*(chuue+i+1)>>8-k;
        
*(chasc+i)|=t;
    }

}
 

// 编码一个ASC串为Uue串,先传入NULL到uuestr,返回uuelen,未包含'
DWORD  CUuencode::UueStr( const  unsigned  char  ascstr[],size_t asclen,unsigned  char  uuestr[],size_t  & uuelen,UueOutMode mode)
{
    size_t asclen_3
=asclen+((asclen%3)?(3-(asclen%3)):0); 
    size_t require
=asclen_3;
    
if(uuestr==NULL)
    
{
        
        
if(mode==out_str)
            
/*    |----DATA---|---------Line Header +' '-------|*/
        
{    
            uuelen
= require*4/3+(asclen/45)*2+((asclen%45)?1:0)*2;
            
return 0;
        }


        
else
        
{
            
/*    |----DATA---|---------Line Header +' '-------|---"BEGIN "----|------|-' '-|-------|-'/n'-|---"' END"---*/
            uuelen
= require*4/3+(asclen/45)*2+((asclen%45)?1:0)*2+_mbslen(beginFlag)+IDlen+  1  +namelen+ 1    +_mbslen(endFlag);
            
return 0;
        }

        
    }

    unsigned 
char *temp=new unsigned char[asclen_3];
    
//memory alloc fail
    if(temp==NULL) return GetLastError();
    unsigned 
char *pdel=temp;
    unsigned 
char *puue=uuestr;
    memset(temp,
0,asclen_3);
    memcpy(temp,ascstr,asclen);
    
if(mode==out_file)
    
{
        _mbscpy(uuestr,beginFlag);
        uuestr
+=_mbslen(beginFlag);
        _mbscpy(uuestr,FID);
        uuestr
+=IDlen;
        
*uuestr++=' ';
        _mbscpy(uuestr,FileName);
        uuestr
+=namelen;
        
        
*uuestr++=' ';
    }

    
for(size_t i=0;i<asclen_3;)
    
{
        
if(0==i%45)
            
*uuestr++=0x20+((asclen_3-i>=45)?45:(asclen_3-i));
        UueChar(temp,uuestr);
        temp
+=3;
        uuestr
+=4;
        
if(!((i+3)%45))
        
{
            
*uuestr++=' ';
        }

        i
+=3;
    }

    
*uuestr++=' ';
    
if(mode==out_file)
    
{
        _mbscpy(uuestr,endFlag);

    }

    
//*uuestr='
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值