int EncodeQuoted(const unsigned char* pSrc, char* pDst, int nSrcLen, int nMaxLineLen)
{
int nDstLen; // 输出的字符计数
int nLineLen; // 输出的行长度计数
nDstLen = 0;
nLineLen = 0;
for (int i = 0; i < nSrcLen; i++, pSrc++)
{
// ASCII 33-60, 62-126原样输出,其余的需编码
if ((*pSrc >= '!') && (*pSrc <= '~') && (*pSrc != '='))
{
*pDst++ = (char)*pSrc;
nDstLen++;
nLineLen++;
}
else
{
sprintf(pDst, "=%02X", *pSrc);
pDst += 3;
nDstLen += 3;
nLineLen += 3;
}
// 输出换行?
if (nLineLen >= nMaxLineLen - 3)
{
sprintf(pDst, "=\r\n");
pDst += 3;
nDstLen += 3;
nLineLen = 0;
}
}
// 输出加个结束符
*pDst = '\0';
return nDstLen;
}
Quoted-Printable解码很简单,将编码过程反过来就行了。
int DecodeQuoted(const char* pSrc, unsigned char* pDst, int nSrcLen)
{
int nDstLen; // 输出的字符计数
int i;
i = 0;
nDstLen = 0;
while (i < nSrcLen)
{
if (strncmp(pSrc, "=\r\n", 3) == 0) // 软回车,跳过
{
pSrc += 3;
i += 3;
}
else
{
if (*pSrc == '=') // 是编码字节
{
sscanf(pSrc, "=%02X", pDst);
pDst++;
pSrc += 3;
i += 3;
}
else // 非编码字节
{
*pDst++ = (unsigned char)*pSrc++;
i++;
}
nDstLen++;
}
}
// 输出加个结束符
*pDst = '\0';
return nDstLen;
}
//---------------------------------------------------------------------------
//用HZ进行编码
void __fastcall EncodeHZ(void)
{
unsigned int x=0,i=0;
unsigned char hz;
while((hz=*FInputText++)!='\0')
{
if(hz>=161)
{
if(!x)
{
*(FOutputText+i)='~';
i++;
*(FOutputText+i)='{';
i++;
x=1;
}
else x=1;
*(FOutputText+i)=(char)(hz-128);
i++;
}
else
{
if(x)
{
*(FOutputText+i)='~';
i++;
*(FOutputText+i)='}';
i++;
x=0;
}
else x=0;
*(FOutputText+i)=hz;
i++;
}
}
if(x)
{
*(FOutputText+i)='~';
i++;
*(FOutputText+i)='}';
i++;
x=0;
}
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//对HZ进行解码
void __fastcall DecodeHZ(void)
{
unsigned i=0;
unsigned char hz;
while((hz=*FInputText++)!='\0')
{
loop2:
if(hz==126)
if((hz=*FInputText++)!='\0')
if(hz==123)
while((hz=*FInputText++)!='\0')
{
loop3:
if(hz==126)
{
if((hz=*FInputText++)!='\0')
if(hz==125) goto loop;
else {*(FOutputText+i)=(char)254;i++;goto loop3;}
}
else {*(FOutputText+i)=(char)(hz+128);i++;}
}
else {*(FOutputText+i)='~';i++;goto loop2;}
else {*(FOutputText+i)='~';i++;goto end;}
else {*(FOutputText+i)=hz;i++;}
loop:;
}
end:;
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//用QP进行编码
void __fastcall EncodeQP(void)
{
unsigned char first,second,sour;
unsigned int i=0;
while((sour=*FInputText++)!='\0')
{
if(sour==61)
{
*(FOutputText+i)='=';
i++;
*(FOutputText+i)='3';
i++;
*(FOutputText+i)='D';
i++;
}
else
{
if(sour>127)
{
first=sour>>4;
second=sour&15;
if(first>9) first+=55;
else first+=48;
if(second>9) second+=55;
else second+=48;
*(FOutputText+i)='=';
i++;
*(FOutputText+i)=first;
i++;
*(FOutputText+i)=second;
i++;
}
else {*(FOutputText+i)=sour;i++;}
}
}
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//对QP进行解码
void __fastcall DecodeQP(void)
{
unsigned char first,second,sour;
unsigned int i=0;
while((sour=*FInputText++)!='\0')
{
if(sour==61)
{
if((first=*FInputText++)=='\0') {*(FOutputText+i)=sour;i++;break;}
else if((first<48)||((first>57)&&(first<65))||(first>70))
{
*(FOutputText+i)=sour;
i++;
*(FOutputText+i)=first;
i++;
continue;
}
else if((second=*FInputText++)=='\0')
{
*(FOutputText+i)=sour;
i++;
*(FOutputText+i)=first;
i++;
break;
}
else if((second<48)||((second>57)&&(second<65))||(second>70))
{
*(FOutputText+i)=sour;
i++;
*(FOutputText+i)=first;
i++;
*(FOutputText+i)=second;
i++;
continue;
}
if(first>=65) first-=55;
else first-=48;
if(second>=65) second-=55;
else second-=48;
sour=NULL;
sour=first<<4;
sour|=second;
}
*(FOutputText+i)=sour;
i++;
}
*(FOutputText+i)='\0';
FOutput=(AnsiString)FOutputText;
}
//---------------------------------------------------------------------------
//用Base64进行编码
void __fastcall EncodeBase64(void)
{
unsigned char *sour,*obje,*inputtext;
unsigned int i,j=0,m=57,n=57;
inputtext=FInputText;
sour=new char[57];
obje=new char[76];
while(m==57)
{
m=strlen(inputtext);
if(m<57)
{
if(m==0) break;
n=m;
strncpy(sour,inputtext,m);
if(n%3) n=n-n%3+3;
for(i=m;i<n;i++)
*(sour+i)=NULL;
}
else
{
m=57;
strncpy(sour,inputtext,m);
}
inputtext+=m;
for(i=0;i<n/3;i++)
Base64(sour+i*3,obje+i*4);
strncpy(FOutputText+j,obje,n/3+m); //n/3*4-(n-m)
j+=n/3+m;
for(i=0;i<(n-m);i++,j++)
*(FOutputText+j)='=';
*(FOutputText+j++)='\n';
}
*(FOutputText+j)='\0';
FOutput=(AnsiString)FOutputText;
delete []sour;
delete []obje;
}
//---------------------------------------------------------------------------
void __fastcall Base64(unsigned char chasc[3],unsigned char chuue[4])
/*
chasc:未编码的二进制代码
chuue:编码过的Base64代码
*/
{
unsigned int i,k=2;
unsigned char t=NULL;
for(i=0;i<3;i++)
{
*(chuue+i)=*(chasc+i)>>k;
*(chuue+i)|=t;
t=*(chasc+i)<<(8-k);
t>>=2;
k+=2;
}
*(chuue+3)=*(chasc+2)&63;
for(i=0;i<4;i++)
if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65;
else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71;
else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4;
else if(*(chuue+i)==62) *(chuue+i)=43;
else if(*(chuue+i)==63) *(chuue+i)=47;
}
//---------------------------------------------------------------------------
//对Base64解码
void __fastcall DecodeBase64(void)
{
unsigned char *sour,*obje,*inputtext;
unsigned int i,j=0,m=57,n=76;
sour=new char[76];
obje=new char[57];
inputtext=FInputText;
while(m==57)
{
while(*inputtext=='\r'||*inputtext=='\n')
inputtext++;
m=strlen(inputtext);
if(m<76)
{
if(m==0) break;
n=m;
}
m=n/4*3;
strncpy(sour,inputtext,n);
inputtext+=n;
for(i=0;i<n/4;i++)
unBase64(sour+i*4,obje+i*3);
strncpy(FOutputText+j,obje,m);
j+=m;
}
*(FOutputText+j)='\0';
FOutput=(AnsiString)FOutputText;
delete []sour;
delete []obje;
}
//---------------------------------------------------------------------------
/*Base64解码*/
void __fastcall unBase64(unsigned char chuue[4],unsigned char chasc[3])
/*
chuue:未解码的Base64代码
chasc:解码过的二进制代码
*/
{
int i,k=2;
unsigned char t=NULL;
for(i=0;i<4;i++)
if((*(chuue+i)>=65)&&(*(chuue+i)<=90)) *(chuue+i)-=65;
else if((*(chuue+i)>=97)&&(*(chuue+i)<=122)) *(chuue+i)-=71;
else if((*(chuue+i)>=48)&&(*(chuue+i)<=57)) *(chuue+i)+=4;
else if(*(chuue+i)==43) *(chuue+i)=62;
else if(*(chuue+i)==47) *(chuue+i)=63;
else if(*(chuue+i)==61) *(chuue+i)=0;
for(i=0;i<3;i++)
{
*(chasc+i)=*(chuue+i)<<k;
k+=2;
t=*(chuue+i+1)>>8-k;
*(chasc+i)|=t;
}
}
//---------------------------------------------------------------------------
//用UUenCode进行编码
void __fastcall EncodeUue(void)
{
unsigned char *sour,*obje,*inputtext;
unsigned int i,j=0,m=45,n=45,num;
inputtext=FInputText;
sour=new char[45];
obje=new char[60];
while(m==45)
{
m=strlen(inputtext);
if(m<45)
{
if(m==0) break;
n=m;
strncpy(sour,inputtext,m);
if(n%3) n=n-n%3+3;
for(i=m;i<n;i++)
*(sour+i)=NULL;
}
else
{
m=45;
strncpy(sour,inputtext,m);
}
inputtext+=m;
for(i=0;i<n/3;i++)
Uue(sour+i*3,obje+i*4);
*(FOutputText+j++)=m+32;
strncpy(FOutputText+j,obje,n/3*4);
j+=n/3*4;
*(FOutputText+j++)='\n';
}
*(FOutputText+j++)='`';
*(FOutputText+j++)='\n';
*(FOutputText+j)='\0';
FOutput=(AnsiString)FOutputText;
delete []sour;
delete []obje;
}
//---------------------------------------------------------------------------
/*Uuencode编码*/
void __fastcall Uue(unsigned char chasc[3],unsigned char chuue[4])
/*
chasc:未编码的二进制代码
chuue:编码过的Uue代码
*/
{
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解码
void __fastcall DecodeUue(void)
{
unsigned char *sour,*obje,*inputtext;
unsigned int i,j=0,m=45,n;
sour=new char[60];
obje=new char[45];
inputtext=FInputText;
while(m==45)
{
while(*inputtext=='\r'||*inputtext=='\n')
inputtext++;
if((m=*inputtext)!=96||m=='\0')
{
n=m-32;
m=n;
inputtext++;
}
else break;
if(n<45)
{
if(n%3) n=(n-n%3+3)/3*4;
else n=n/3*4;
}
else
n=n/3*4;
strncpy(sour,inputtext,n);
inputtext+=n;
for(i=0;i<n/4;i++)
unUue(sour+i*4,obje+i*3);
strncpy(FOutputText+j,obje,m);
j+=m;
}
*(FOutputText+j)='\0';
FOutput=(AnsiString)FOutputText;
delete []sour;
delete []obje;
}
//---------------------------------------------------------------------------
/*Uuencode解码*/
void __fastcall unUue(unsigned char chuue[4],unsigned char chasc[3])
/*
chuue:未解码的Uue代码
chasc:解码过的二进制代码
*/
{
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;
}
}
//---------------------------------------------------------------------------
//用XXenCode进行编码
void __fastcall EncodeXxe(void)
{
unsigned char *sour,*obje,*inputtext;
unsigned int i,j=0,m=45,n=45;
char set[]="+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
inputtext=FInputText;
sour=new char[45];
obje=new char[60];
while(m==45)
{
m=strlen(inputtext);
if(m<45)
{
if(m==0) break;
n=m;
strncpy(sour,inputtext,m);
if(n%3) n=n-n%3+3;
for(i=m;i<n;i++)
*(sour+i)=NULL;
}
else
{
m=45;
strncpy(sour,inputtext,m);
}
inputtext+=m;
for(i=0;i<n/3;i++)
Xxe(sour+i*3,obje+i*4);
*(FOutputText+j++)=set[m&63];
strncpy(FOutputText+j,obje,n/3*4);
j+=n/3*4;
*(FOutputText+j++)='\n';
}
*(FOutputText+j++)='+';
*(FOutputText+j++)='\n';
*(FOutputText+j)='\0';
FOutput=(AnsiString)FOutputText;
delete []sour;
delete []obje;
}
//---------------------------------------------------------------------------
/*Xxencode编码*/
void __fastcall Xxe(unsigned char chasc[3],unsigned char chxxe[4])
/*
chasc:未编码的二进制代码
chxxe:编码过的Xxe代码
*/
{
int i;
char set[]="+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
chxxe[0]=chasc[0]>>2;
chxxe[1]=(chasc[0]<<4)&48|(chasc[1]>>4)&15;
chxxe[2]=(chasc[1]<<2)&60|(chasc[2]>>6)&3;
chxxe[3]=chasc[2]&63;
for(i=0;i<4;i++) chxxe[i]=set[chxxe[i]]; /*查表*/
}
/*需注意的是,Xxencode文件正文部分中每一行的第一个字母是:从源文件中实际 读取的字符数的ASCII值取后六位后用set[]查表得到的。*/
//---------------------------------------------------------------------------
//对XXenCode解码
void __fastcall DecodeXxe(void)
{
unsigned char *sour,*obje,*inputtext;
unsigned int i,j=0,m=45,n;
sour=new char[60];
obje=new char[45];
inputtext=FInputText;
while(m==45)
{
while(*inputtext=='\r'||*inputtext=='\n')
inputtext++;
if((m=*inputtext)!='+'||m=='\0')
{
n=set(m);
m=n;
inputtext++;
}
else break;
if(n<45)
{
if(n%3) n=(n-n%3+3)/3*4;
else n=n/3*4;
}
else n=n/3*4;
strncpy(sour,inputtext,n);
inputtext+=n;
for(i=0;i<n/4;i++)
unXxe(sour+i*4,obje+i*3);
strncpy(FOutputText+j,obje,m);
j+=m;
}
*(FOutputText+j)='\0';
FOutput=(AnsiString)FOutputText;
delete []sour;
delete []obje;
}
//---------------------------------------------------------------------------
/*Xxencode解码*/
unsigned char __fastcall set(unsigned char ch) /*查表函数*/
{
if(ch==43) ch=0;
else if(ch==45) ch=1;
else if(ch>=48&&ch<=57) ch-=46;
else if(ch>=65&&ch<=90) ch-=53;
else if(ch>=97&&ch<=122) ch-=59;
return ch;
}
//---------------------------------------------------------------------------
void __fastcall unXxe(unsigned char chxxe[4],unsigned char chasc[3])
/*
chxxe:未解码的Xxe代码
chasc:解码过的二进制代码
*/
{
int k=2 ,i;
unsigned char t;
t=NULL;
*chxxe=set(*chxxe);
for(i=0;i<3;i++)
{
*(chxxe+i+1)=set(*(chxxe+i+1));
*(chasc+i)=*(chxxe+i)<<k;
k+=2;
t=*(chxxe+i+1)>>8-k;
*(chasc+i)|=t;
}
}