国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 05:40:00
字體:
來源:轉載
供稿:網友

  首先我要在這里向各位糾正我犯在一個錯誤:Base64 只是 MIME 的一種編碼方案, 我原來所說的 MIME 其實是 MIME 的另一種編碼方案 -- Quoted-PRintable ,所以我對本文作了一些修正, 并對由此而給大家帶來的誤導表示歉意。 May.6-01

    最近在研究 POP3 時碰到一個問題,即其中的中文都是經過 MIME 編碼了的, 如 MS Outlook EXPress 是用 Base64 ,而 Foxmail 則用的是 QP , 本來想找幾個現成的編碼/解碼的代碼,結果只在 UDDF 中找到一個 Delphi 的 Base64 Decode , 雖然 UDDF 說是 Encode/Decode ,但我是沒找到 Encode 的部分,而且寫得不好, 只好自已寫一個了。

    此代碼是一個 BCB 的單元,非常簡單,提供了四個函數, 要改成 Delphi 或其它 C/C++ 也很輕易,有需要的自已改吧。此代碼經過測試,結果正確。

    補充:因為不久前有一位用 VC 的朋友在引用此代碼時出碰到一些困難, 是由于 BCB 的 AnsiString 的非凡性造成的,所以我將此代碼改寫為標準 C 的,本來是應該這樣的, 但我習慣了用 AnsiString 所以才寫成那樣的,不過現在只好改寫了。但為了方便 Delphi/BCB 使用,我還是非凡加了一些東東,詳見程序的注釋,目的無非是為了更好用一些,其它語言的請自行參考吧。Mar.31-01

    再補充:為了使這段程序更加實用,我將其整理為幾個單元, 分別用于 Delphi 和 C++Builder 。包括對數據流 TMemoryStream 和字符串的處理。可以在本站作品中下載。Aug.14-01

修正:因為不久前一位網友給我發來MAIL說他在用些代碼解碼郵件附件時出錯,我檢查后發現我的解碼函數只能處理連續字符串,而一般郵件附件都是帶回車的字符串,所以我作了一點點修正,見下面的注釋。Apr.03-02

    下面是頭文件:

//---------------------------------------------------------------------------
//  MIME(QP & Base64) Encode/Decode unit. (H)
//  Copyright (c) 2000, 02 Mental Studio - http://mental.mentsu.com
//  Author : Raptor - raptorz@163.com
//---------------------------------------------------------------------------
#ifndef mimeb64H
#define mimeb64H
//---------------------------------------------------------------------------

#ifdef __cplusplus
extern "C" {
#endif

int QPEncode(     char * const aDest, const unsigned char * aSrc, int aLen );
int QPDecode(     unsigned char * const aDest, const char * aSrc );
int Base64Encode( char * const aDest, const unsigned char * aSrc, int aLen );
int Base64Decode( unsigned char * const aDest, const char * aSrc );

#ifdef __cplusplus
}
#endif
//---------------------------------------------------------------------------
#endif
      

    下面是 C 文件:

//---------------------------------------------------------------------------
//  MIME(QP & Base64) Encode/Decode unit. (C)

//  Copyright (c) 2000, 01 Mental Studio - http://mental.mentsu.com
//  Author : Raptor - raptorz@163.com
//---------------------------------------------------------------------------
//
//  如要用于 Delphi ,請用如下命令編譯本單元,產生 mimeb64.obj 文件:
//  bcc32 -c -pr -O2 -C -K -N- -k- -d -3 -r- mimeb64.c
//  各參數意義分別為:
//  -c  編譯為 obj 文件
//  -pr 產生 Pascal 的 fastcall 調用方式
//  -O2 優化選項為2
//  -C  答應嵌套注釋
//  -K  默認使用無符號字符
//  -N- 不對棧溢出作檢查
//  -k- 不使用標準棧框架
//  -d  合并重復的字符串
//  -3  使用 386 指令
//  -r- 未知^_^
//
//  為方便使用,在 BCB 中可編寫下面這個函數:
/*
//  aOp : 0(QPEncode) 1(QPDecode) 2(Base64Encode) 3(Base64Decode)
AnsiString MimeQPBase64( AnsiString aSrc, int aOp )
{
    int n;
    TMemoryStream * buf;
    AnsiString s = "";

    buf = new TMemoryStream( );
    try
    {
        n = aSrc.Length( );
        if ( aOp == 0 )
        {  //  QPEncode
            buf->Size = n * 3 + 1;
            QPEncode( ( char * )( buf->Memory ), ( unsigned char * )( aSrc.c_str( ) ), n );
        }
        else if ( aOp == 2 )
        {  //  Base64Encode
            buf->Size = n * 4 / 3 + 1;
            Base64Encode( ( char * )( buf->Memory ), ( unsigned char * )( aSrc.c_str( ) ), n );
        }
        else
        {
            buf->Size = n + 1;
            if ( aOp == 1 )  //  QPDecode
                n = QPDecode( ( unsigned char * )( buf->Memory ), aSrc.c_str( ) );
            else             //  Base64Decode

                n = Base64Decode( ( unsigned char * )( buf->Memory ), aSrc.c_str( ) );
            ( ( char * )( buf->Memory ) )[n] = 0;
        }
        s = AnsiString( ( char * )( buf->Memory ) );
    }
    __finally
    {
        delete buf;
    }
    return s;
}
*/
//  在 Delphi 中則要編寫下面這個單元:
/*
Unit Mime;

Interface

Function MimeQPBase64( aSrc : String; aOp : Integer ) : String;

Implementation

{$L mimeb64.obj}

Function QPEncode(     aDest : PChar; aSrc : PByte; aLen : Integer ) : Integer; External;
Function QPDecode(     aDest : PByte; aSrc : PChar                 ) : Integer; External;
Function Base64Encode( aDest : PChar; aSrc : PByte; aLen : Integer ) : Integer; External;
Function Base64Decode( aDest : PByte; aSrc : PChar                 ) : Integer; External;

//  因為DELPHI不包含string.h中的函數,所以要寫這么個函數
Function _strlen( aStr : PChar ) : Integer; cdecl;
Begin
    Result := Leng

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 二手房| 富顺县| 淄博市| 弥勒县| 龙州县| 老河口市| 张家界市| 深州市| 海南省| 华宁县| 南投县| 泸溪县| 玉林市| 会理县| 武山县| 察哈| 高州市| 汤阴县| 葫芦岛市| 观塘区| 商城县| 广宗县| 莱芜市| 云梦县| 洛川县| 平舆县| 桐庐县| 宜阳县| 延吉市| 沁阳市| 太和县| 招远市| 广德县| 开远市| 梨树县| 嘉鱼县| 定州市| 特克斯县| 旺苍县| 安新县| 汽车|