全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3393
推到 Plurk!
推到 Facebook!

[推薦] MIME 和 BASE64 編碼/解碼程序代碼

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-30 12:47:55 IP:61.218.xxx.xxx 未訂閱

MIME 和 BASE64 編碼/解碼程序代碼

作者: 猛禽 資料來源:http://www.dbgnu.com/bcb/doc/view.asp?page=117 最近在研究 POP3 時碰到一個問題,即其中的中文都是經過編碼了的, 如 MS Outlook Express 是用 BASE64 ,而 FoxMail 則用的是 MIME , 本來想找幾個現成的編碼/解碼的代碼,結果只在 UDDF 中找到一個 Delphi 的 BASE64 Decode , 雖然 UDDF 說是 Encode/Decode ,但我是沒找到 Encode 的部分,而且寫得不好, 只好自已寫一個了。 此代碼是一個 BCB 的單元,非常簡單,提供了四個函數, 要改成 Delphi 或其它 C/C 也很容易,有需要的自已改吧。此代碼經過測試,結果正確。 下面是頭文件:
    //---------------------------------------------------------------------------
// MIME & BASE64 Encode/Decode unit. (H)
// Copyright (c) 2000 Mental Studio - http://mentals.126.com
// Author : Raptor - raptorz@126.com
//---------------------------------------------------------------------------
#ifndef mimeb64H
#define mimeb64H
//---------------------------------------------------------------------------    AnsiString MimeEncode( AnsiString s );
AnsiString MimeDecode( AnsiString s );
AnsiString Base64Encode( AnsiString s );
AnsiString Base64Decode( AnsiString s );
//---------------------------------------------------------------------------
#endif    下面是 CPP 文件:     //---------------------------------------------------------------------------
// MIME & BASE64 Encode/Decode unit. (CPP)
// Copyright (c) 2000 Mental Studio - http://mentals.126.com
// Author : Raptor - raptorz@126.com
//---------------------------------------------------------------------------    #include 
#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;
}
//--------------------------------------------------------------------------- 時間就是金錢---[ 發問前請先找找舊文章]
系統時間:2024-07-02 1:18:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!