首先我要在这里向各位纠正我犯在一个错误: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