请教IdBase64Encoder

zjlxl 2004-03-31 07:01:02
那位大侠知道IdBase64Encoder用法,我看了半天帮助还是不对
...全文
102 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
csmiori 2004-04-02
  • 打赏
  • 举报
回复
我看不太明白!
有没有具体这方面的资料!我想对IdBase64Encoder,IdBase64Decoder两个组件的用法学一下。谢谢!有的话请发送到我的邮箱里:csmiori@hotmail.com
cuiyu616ok 2004-04-01
  • 打赏
  • 举报
回复
下面这段代码对你有用马?



// MIME & BASE64 Encode/Decode unit. (CPP)

// Copyright (c) 2000 Mental Studio - http://mentals.126.com

// Author : Raptor - raptorz@126.com

#pragma hdrstop



#include "mimeb64.h"





#pragma package(smart_init)



// 4bit binary to char 0-F

char Hex2Chr( Byte n )

{

n &= 0xF;

if ( n < 10 )

return ( char )( n + '0' );

else

return ( char )( n - 10 + 'A' );

}



// char 0-F to 4bit binary

Byte Chr2Hex( char c )

{

c = toupper( c );

if ( c >= '0' && c <= '9' )

return ( int )( c - '0' );

else if ( c >= 'A' && c <= 'F' )

return ( int )( c - 'A' + 10 );

else

return -1;

}



// Base64 code table

// 0-63 : A-Z(25) a-z(51), 0-9(61), +(62), /(63)

char __fastcall Base2Chr( Byte n )

{

n &= 0x3F;

if ( n < 26 )

return ( char )( n + 'A' );

else if ( n < 52 )

return ( char )( n - 26 + 'a' );

else if ( n < 62 )

return ( char )( n - 52 + '0' );

else if ( n == 62 )

return '+';

else

return '/';

}



Byte Chr2Base( char c )

{

if ( c >= 'A' && c <= 'Z' )

return ( Byte )( c - 'A' );

else if ( c >= 'a' && c <= 'z' )

return ( Byte )( c - 'a' + 26 );

else if ( c >= '0' && c <= '9' )

return ( Byte )( c - '0' + 52 );

else if ( c == '+' )

return 62;

else

return 63;

}

AnsiString MimeEncode( AnsiString s )

{

AnsiString asTemp = "";

int i = 1, n = s.Length( );



while ( i <= n )

{

asTemp += '=';

asTemp += Hex2Chr( ( Byte )( s[i] >> 4 ) );

asTemp += Hex2Chr( ( Byte )( s[i] ) );

i++;

}

return asTemp;

}

//---------------------------------------------------------------------------

//

AnsiString MimeDecode( AnsiString s )

{

AnsiString asTemp = "";

int i = 1, n = s.Length( );

Byte ch, cl; // 因为有些软件(e.g.Foxmail)对一些 < 0x7f 的字符不编码,此函数作了一些修改



while ( i <= n )

{

if ( ( s[i] == '=' ) && ( i + 2 <= n ) )

{

ch = Chr2Hex( s[i + 1] );

cl = Chr2Hex( s[i + 2] );

if ( ( ch == ( Byte )-1 ) || ( cl == ( Byte )-1 ) )

asTemp += s[i]; // 未编码的'='

else

{

asTemp += ( char )( ( ch << 4 ) | cl );

i += 2;

}

}

else

asTemp += s[i]; // 未编码的字符

i++;

}

return asTemp;

}



//

AnsiString Base64Encode( AnsiString s )

{

int n = s.Length( );

Byte c, t;

AnsiString asTemp = "";



for ( int i = 1; i <= n; i++ )

{

c = s[i];

if ( i % 3 == 1 )

{

asTemp += Base2Chr( c >> 2 );

t = ( c << 4 ) & 0x3F;

}

else if ( i % 3 == 2 )

{

asTemp += Base2Chr( t | ( c >> 4 ) );

t = ( c << 2 ) & 0x3F;

}

else

{

asTemp += Base2Chr( t | ( c >> 6 ) );

asTemp += Base2Chr( c );

}

}

if ( n % 3 != 0 )

{

asTemp += Base2Chr( t );

if ( n % 3 == 1 )

asTemp += "==";

else

asTemp += "=";

}

return asTemp;

}



//

AnsiString Base64Decode( AnsiString s )

{

int n = s.Length( );

Byte c, t;

AnsiString asTemp = "";



for ( int i = 1; i <= n; i++ )

{

if ( s[i] == '=' )

break;

c = Chr2Base( s[i] );

if ( i % 4 == 1 )

t = c << 2;

else if ( i % 4 == 2 )

{

asTemp += ( char )( t | ( c >> 4 ) );

t = ( Byte )( c << 4 );

}

else if ( i % 4 == 3 )

{

asTemp += ( char )( t | ( c >> 2 ) );

t = ( Byte )( c << 6 );

}

else

asTemp += ( char )( t | c );

}

return asTemp;

}

//上面的代码是拿别人的

//下面的代码为invalid自己完成

//invalid@21cn.com

AnsiString UnQPCode(AnsiString QPString)

{

AnsiString Result = "";

int iLength = QPString.Length();

for(int i=1;i <= iLength;i++)

{

if((QPString[i]=='=')&&(i+2<=iLength)

&& (((QPString[i+1]>='A') && (QPString[i+1]<='F'))||((QPString[i+1]>='0') && (QPString[i+1]<='9')))

&& (((QPString[i+2]>='A') && (QPString[i+2]<='F'))||((QPString[i+2]>='0') && (QPString[i+2]<='9')))

)

{

Result += String(char(StrToInt("0X"+QPString.SubString(i+1,2))));

i+=2;

}

else

Result +=QPString[i];

}

return Result;

}

//解决Indy 的POP组件收到的主题和发信人编码错乱问题

//

AnsiString UnCodeBase(AnsiString str)

{

//=?us-ascii?q?com?= =?us-ascii?q?=2E?= =?us-ascii?q?cn?= from server TS1/THOUGHT.COM.CN. Check

String result="";

String code="";

String flag="";

int iPos1=0,iPos2,iPos3,iPos4=0;

while(str.Length()>0)

{

iPos1=0;

iPos2=0;

iPos3=0;

iPos4=0;

iPos1 = str.Pos("=?");

iPos2 = str.SubString(iPos1+2,str.Length()-iPos1-1).Pos("?");

if(iPos2>0)

{

iPos2+=iPos1+1;

iPos3 = str.SubString(iPos2+1,str.Length()-iPos2).Pos("?");

if(iPos3>0)

{

iPos3+=iPos2;

iPos4 = str.SubString(iPos3+1,str.Length()-iPos3).Pos("?=");

if(iPos4>0)

iPos4+=iPos3;

}



}

if(iPos1==0||iPos4==0||iPos2==0||iPos3==0||(iPos1+1)>iPos2||(iPos2+1)>iPos3||(iPos3+1)>iPos4)

{

result+=str;

break;

}

//注释掉就忽略掉两段编码之间的内容。

// if(iPos1>1)

// result+=str.SubString(1,iPos1-1);

if(str.SubString(iPos2+1,iPos3-iPos2-1).UpperCase() == "Q")

{

result+=UnQPCode(str.SubString(iPos3+1,iPos4-iPos3-1));

}

else if(str.SubString(iPos2+1,iPos3-iPos2-1).UpperCase() == "B")

{

result+=Base64Decode(str.SubString(iPos3+1,iPos4-iPos3-1));

}

else

result+=str.SubString(iPos3+1,iPos4-iPos3-1);

str = str.SubString(iPos4+2,str.Length()-iPos4-1);

}

return result;

}

AnsiString UnCode(AnsiString str)

{

AnsiString temp = str;

AnsiString result="";

int iPos=0;

TStringList *sl = new TStringList;

while(temp.Length()>0)

{

iPos = temp.Pos("\n");

if(iPos>0)

{

sl->Add(temp.SubString(1,iPos-1).Trim());

temp=temp.SubString(iPos+1,temp.Length()-iPos).Trim();

}

else

{

sl->Add(temp.Trim());

break;

}

}

for(int i=0;i<sl->Count;i++)

{

result+=UnCodeBase(sl->Strings[i]);

}

delete sl;

return result;

}

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧