MIME(BASE64-QP) 编码-解码程序代码

  • 格式:pdf
  • 大小:29.33 KB
  • 文档页数:7

#include #include "mimeb64.h" //--------------------------------------------------------------------------#pragma package(smart_init) //--------------------------------------------------------------------------// 4bit binary to char 0-F char Hex2Chr( unsigned char n ) { n &= 0xF; if ( n < 10 ) return ( char )( n + '0' ); else return ( char )( n - 10 + 'A' ); } //--------------------------------------------------------------------------// char 0-F to 4bit binary unsigned char Chr2Hex( char c ) { if ( c >= 'a' && c <= 'z' ) c = c - 'a' + 'A'; if ( c >= '0' && c <= '9' ) return ( int )( c - '0' ); else if ( c >= 'A' && c <= 'F' ) return ( int )( c - 'A' + 10 ); else return -1; } //--------------------------------------------------------------------------// // char { Base64 code table 0-63 : A-Z(25) a-z(51), 0-9(61), +(62), /(63) Base2Chr( unsigned char 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 '/'; } //--------------------------------------------------------------------------unsigned char Chr2Base( char c ) { if ( c >= 'A' && c <= 'Z' ) return ( unsigned char )( c - 'A' ); else if ( c >= 'a' && c <= 'z' ) return ( unsigned char )( c - 'a' + 26 );
-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 );
file:///D|/技术资料/标准及技术/协议/MIME(BASE64-QP) 编码-解码程序代码.htm(第 3/7 页)2006-6-28 20:34:55
MIME(BASE64/QP) 编码/解码程序代码
*/ // // // 之后便可以使用MimeQPBase64这个函数了。注意:编译时要保证 mimeb64.obj 在搜索路径中。 其它语言直接使用这四个函数即可。
Function Base64Encode( aDest : PChar; aSrc : PByte; aLen : Integer ) : Integer; External; Function Base64Decode( aDest : PByte; aSrc : PChar // 因为DELPHI不包含string.h中的函数,所以要写这么个函数 Function _strlen( aStr : PChar ) : Integer; cdecl; Begin Result := Length( aStr ); End; // aOp : 0(MimeEncode) 1(MimeDecode) 2(Base64Encode) 3(Base64Decode)
Function MimeQPBase64( aSrc : String; aOp : Integer ) : String; Var n : Integer; buf : TMemoryStream; Begin Result := ''; buf := TMemoryStream.Create; Try n := Length( aSrc ); If ( aOp = 0 ) Then Begin // QPEncode buf.Size := n * 3 + 1; QPEncode( PChar( buf.Memory ), PByte( PChar( aSrc ) ), n ); End Else If ( aOp = 2 ) Then Begin // Base64Encode buf.Size := n * 4 DIV 3 + 1; Base64Encode( PChar( buf.Memory ), PByte( PChar( aSrc ) ), n ); End Else Begin buf.Size := n + 1; If ( aOp = 1 ) Then // QPDecode n := QPDecode( PByte( buf.Memory ), PChar( aSrc ) ) Else // Base64Decode n := Base64Decode( PByte( buf.Memory ), PChar( aSrc ) ); PByteArray( buf.Memory )[n] := 0; End; Result := PChar( buf.Memory ); Finally buf.Free; End; End;
#ifdef __cplusplus } #endif //--------------------------------------------------------------------------#endif
下面是 C 文件: //--------------------------------------------------------------------------// MIME(QP & Base64) Encode/DecБайду номын сангаасde unit. (C) // Copyright (c) 2000, 01 Mental Studio - // Author : Raptor - raptorz@
file:///D|/技术资料/标准及技术/协议/MIME(BASE64-QP) 编码-解码程序代码.htm(第 2/7 页)2006-6-28 20:34:55
MIME(BASE64/QP) 编码/解码程序代码
// /*
在 Delphi 中则要编写下面这个单元:
Unit Mime; Interface Function MimeQPBase64( aSrc : String; aOp : Integer ) : String; Implementation {$L mimeb64.obj} Function QPEncode( Function QPDecode( aDest : PChar; aSrc : PByte; aLen : Integer ) : Integer; External; aDest : PByte; aSrc : PChar ) : Integer; External; ) : Integer; External;
首先我要在这里向各位纠正我犯在一个错误: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.3101 再补充:为了使这段程序更加实用,我将其整理为几个单元, 分别用于 Delphi 和 C++Builder 。包括对数据流 TMemoryStream 和 字符串的处理。可以在本站作品中下载。Aug.14-01 下面是头文件: //--------------------------------------------------------------------------// MIME(QP & Base64) Encode/Decode unit. (H) // Copyright (c) 2000, 01 Mental Studio - // Author : Raptor - raptorz@ //--------------------------------------------------------------------------#ifndef mimeb64H #define mimeb64H //--------------------------------------------------------------------------#ifdef __cplusplus extern "C" { #endif int int int int QPEncode( QPDecode( Base64Encode( Base64Decode( char * const aDest, const unsigned unsigned char * const aDest, const char * const aDest, const unsigned unsigned char * const aDest, const char char char char * * * * aSrc, int aLen ); aSrc ); aSrc, int aLen ); aSrc );