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

合集下载

base64解析

base64解析

base64解析
base64编码是一种用64个字符来表示任意二进制数据的方法。

它是一种简单
的文本编码方式,可以将任何类型的文本或二进制数据编码为文本文件,例如电子邮件附件,图像文件或其他二进制数据文件。

Base64编码的性质非常强,使用
base64编码可以将任何字符、数字和控制字符统一转换为64个字符组成的字符串,比其他任何字符串编码都要有效得多,以节省空间,保护数据完整性,防止数据泄漏。

Base64编码的优点很多,首先,它有效地解决了字符编码的繁琐问题,编码
规则简洁易懂,能够有效缩短图片信息在文件传输过程中的传输时间和存储空间。

它还支持大多数常用浏览器,并且极其方便,可以简单方便地对图片文件和文本文件进行编解码,从而能够轻松地实现图片保护,确保数据的真实性,避免图片被破解和失真。

总之,base64编码是一种强大,有效,安全的编码方式,在文件传输、信息加密和从字符串或二进制数据文件提取信息等方面都有重要作用,今后传输文件和安全传输信息将会更加容易,更安全。

Base64编码与解码原理

Base64编码与解码原理

Base64编码与解码原理Base64编码是使⽤64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号⽤作后缀⽤途。

base64索引表base64编码与解码的基础索引表如下base64编码原理(1)base64编码过程Base64将输⼊字符串按字节切分,取得每个字节对应的⼆进制值(若不⾜8⽐特则⾼位补0),然后将这些⼆进制数值串联起来,再按照6⽐特⼀组进⾏切分(因为2^6=64),最后⼀组若不⾜6⽐特则末尾补0。

将每组⼆进制值转换成⼗进制,然后在上述表格中找到对应的符号并串联起来就是Base64编码结果。

由于⼆进制数据是按照8⽐特⼀组进⾏传输,因此Base64按照6⽐特⼀组切分的⼆进制数据必须是24⽐特的倍数(6和8的最⼩公倍数)。

24⽐特就是3个字节,若原字节序列数据长度不是3的倍数时且剩下1个输⼊数据,则在编码结果后加2个=;若剩下2个输⼊数据,则在编码结果后加1个=。

完整的Base64定义可见RFC1421和RFC2045。

因为Base64算法是将3个字节原数据编码为4个字节新数据,所以Base64编码后的数据⽐原始数据略长,为原来的4/3。

(2)简单编码流程下⾯举例对字符串“ABCD”进⾏base64编码:对于不⾜6位的补零(图中浅红⾊的4位),索引为“A”;对于最后不⾜3字节,进⾏补零处理(图中红⾊部分),以“=”替代,因此,“ABCD”的base64编码为:“QUJDRA==”。

base64解码原理(1)base64解码过程base64解码,即是base64编码的逆过程,如果理解了编码过程,解码过程也就容易理解。

将base64编码数据根据编码表分别索引到编码值,然后每4个编码值⼀组组成⼀个24位的数据流,解码为3个字符。

对于末尾位“=”的base64数据,最终取得的4字节数据,需要去掉“=”再进⾏转换。

解码过程可以参考上图,逆向理解:“QUJDRA==” ——>“ABCD”1)将所有字符转化为ASCII 码;2)将ASCII 码转化为8位⼆进制;3)将8位⼆进制3个归成⼀组(不⾜3个在后边补0)共24位,再拆分成4组,每组6位;4)将每组6位的⼆进制转为⼗进制;5)从Base64编码表获取⼗进制对应的Base64编码;(2)base64解码特点base64编码中只包含64个可打印字符,⽽PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成⼀个新的字符串进⾏解码。

Base64编解码

Base64编解码

Base64编解码一、编码原理Base64是一种基于64个可打印字符来表示二进制数据的表示方法。

由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。

三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。

编码后的数据比原来的数据略长,是原来的4/3倍。

它可用来作为电子邮件的传输编码。

在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同(Base64de 编码表如下所示)。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。

包括MIME的email,email via MIME, 在XML中存储复杂数据.Base64编码表二、编码流程步骤1:将要编码的所有字符都转化成对应的ASCII码。

步骤2:将所有的ASCII码转换成对应的8位长的二进制数。

步骤3:将所得的二进制数从高位到低位开始分成6位一组,最后一组不足六的则补充0步骤4:将每组二进制数转换成十进制数,然后对照base64的编码表查找得到相应的编码。

注意:1、要求被编码字符是8bit的,所以须在ASCII编码范围内,\u0000-\u00ff,中文就不行。

2、如果被编码的字符串中字符的个数为3的倍数,按照上面的步骤即可得到正确的base64编码。

但是如果不是3的倍数则要分情况讨论。

如果是3的倍数余1,则要在编好的码字后面加上两个“=”,如果是3的倍数余2,这要在编好的码字后面加上一个“=”。

(例如w的base64编码为dw==,w1的base64编码为dzE=)下面我们来对具体的字符串进行编码举例,以便更好的理解编码流程:编码「Man」在此例中,Base64算法将三个字符编码为4个字符特殊情况A的编码为QQ= =BC的编码为QkM=三、核心算法程序算法的基本原理如下:由于每次转换都需要6个bit,而这6个bit可能都来自一个字节,也可以来自前后相临的两个字节。

Base64编码解码(源代码)

Base64编码解码(源代码)

Base64编码解码(源代码)Base64 Content-Transfer-Encoding ( RFC2045 ) 可对任何⽂件进⾏base64 编解码,主要⽤于MIME邮件内容编解码// 11111100 0xFC // 11000000 0x3 // 11110000 0xF0 // 00001111 0xF // 11000000 0xC0 // 00111111 0x3Fbyte *lmMimeEncodeBase64(const byte *octetSource, int size) { byte *m_Base64_Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";int base64size = (((((size) + 2) / 3) * 4) + 1) / 76 * 78 + 78; //add "/r/n" for each line'byte *strEncode = (byte *)MALLOC(base64size); byte cTemp[4];//By RFC2045 --The encoded output stream must be represented in lines of no more than 76 characters each int LineLength=0; int i, len, j=0;MEMSET(strEncode, 0, base64size);for(i=0; i<size; i+=3) { MEMSET(cTemp,0,4);//cTemp[0]=octetSource[i]; //cTemp[1]=octetSource[i+1]; //cTemp[2]=octetSource[i+2];//len=strlen((char *)cTemp);if(i<size-3){ len = 3; cTemp[0]=octetSource[i]; cTemp[1]=octetSource[i+1]; cTemp[2]=octetSource[i+2]; } else{ len = 0; if(i<size){ cTemp[0]=octetSource[i]; ++len; } if(i<size-1){cTemp[1]=octetSource[i+1]; ++len; } if(i<size-2){ cTemp[2]=octetSource[i+2]; ++len; } //DBGPRINTF("temp[0] = %d", cTemp[0]); //DBGPRINTF("temp[1] = %d", cTemp[1]); //DBGPRINTF("temp[2] = %d",cTemp[2]); //DBGPRINTF("strEncode[0] = %d", ((int)cTemp[0] & 0xFC)>>2); //DBGPRINTF("strEncode[1] = %d",((int)cTemp[0] & 0x3)<<4 | ((int)cTemp[1] & 0xF0)>>4); //DBGPRINTF("strEncode[2] = %d", ((int)cTemp[1] & 0xF)<<2 | ((int)cTemp[2] & 0xC0)>>6); //DBGPRINTF("strEncode[3] = %d", (int)cTemp[2] & 0x3F); //DBGPRINTF("strEncode[0] = %c",m_Base64_Table[((int)cTemp[0] & 0xFC)>>2]); //DBGPRINTF("strEncode[1] = %c", m_Base64_Table[((int)cTemp[0] & 0x3)<<4 | ((int)cTemp[1] & 0xF0)>>4]); //DBGPRINTF("strEncode[2] = %c", m_Base64_Table[((int)cTemp[1] & 0xF)<<2 | ((int)cTemp[2] &0xC0)>>6]); //DBGPRINTF("strEncode[3] = %c", m_Base64_Table[(int)cTemp[2] & 0x3F]); }if(len==3) { strEncode[j++] = m_Base64_Table[((int)cTemp[0] & 0xFC)>>2]; strEncode[j++] =m_Base64_Table[((int)cTemp[0] & 0x3)<<4 | ((int)cTemp[1] & 0xF0)>>4]; strEncode[j++] = m_Base64_Table[((int)cTemp[1] & 0xF) <<2 | ((int)cTemp[2] & 0xC0)>>6]; strEncode[j++] = m_Base64_Table[(int)cTemp[2] & 0x3F]; LineLength+=4;if(LineLength>=76) {strEncode[j++]='/r'; strEncode[j++]='/n'; LineLength=0;} } else if(len==2) { strEncode[j++] =m_Base64_Table[((int)cTemp[0] & 0xFC)>>2]; strEncode[j++] = m_Base64_Table[((int)cTemp[0] & 0x3 )<<4 | ((int)cTemp[1] & 0xF0 )>>4]; strEncode[j++] = m_Base64_Table[((int)cTemp[1] & 0x0F)<<2]; strEncode[j++] = '='; LineLength+=4;if(LineLength>=76) {strEncode[j++]='/r'; strEncode[j++]='/n'; LineLength=0;} } else if(len==1) { strEncode[j++] =m_Base64_Table[((int)cTemp[0] & 0xFC)>>2]; strEncode[j++] = m_Base64_Table[((int)cTemp[0] & 0x3 )<<4]; strEncode[j++] = '='; strEncode[j++] = '='; LineLength+=4; if(LineLength>=76) {strEncode[j++]='/r'; strEncode[j++]='/n'; LineLength=0;} } memset(cTemp,0,4); } //strEncode[j] = '/0'; //DBGPRINTF("--finished encode base64size = %d, j = %d", base64size, j); //for(i=j; i<base64size; i++){ // DBGPRINTF("--rest char is: %c", strEncode[i]); //} return strEncode; }byte GetBase64Value(char ch) { if ((ch >= 'A') && (ch <= 'Z')) return ch - 'A'; if ((ch >= 'a') && (ch <= 'z')) return ch - 'a' + 26; if ((ch >= '0') && (ch <= '9')) return ch - '0' + 52; switch (ch) { case '+': return 62; case '/': return 63; case '=': /* base64 padding */ return 0; default: return 0; } } byte *lmMimeDecodeBase64(const byte *strSource, int *psize) { byte *m_Base64_Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int i, j, k, size = STRLEN((char *)strSource); int n = 0; //return value byte *octetDecode = (byte *)MALLOC( (((size) - 1) / 4) *3 ); byte cTemp[5]; int Length=0; int asc[4];for(i=0;i<size;i+=4) { MEMSET(cTemp,0,5);cTemp[0]=strSource[i]; cTemp[1]=strSource[i+1]; cTemp[2]=strSource[i+2]; cTemp[3]=strSource[i+3];Length+=4; if(Length==76) { i+=2; Length=0; }for(j=0;j<4;j++) { //if(cTemp[j]=='='){ // asc[j]=0; //}else{ for(k=0;k<(int)STRLEN((char*)m_Base64_Table);k++) { if(cTemp[j]==m_Base64_Table[k]) asc[j]=k; } //} } if('='==cTemp[2] && '='==cTemp[3]) { octetDecode[n++] = (byte)(int)(asc[0] << 2 | asc[1] << 2 >> 6); } else if('='==cTemp[3]) { octetDecode[n++] = (byte)(int)(asc[0] << 2 | asc[1] << 2 >> 6); octetDecode[n++] = (byte)(int)(asc[1] << 4 | asc[2] << 2 >> 4); } else { octetDecode[n++] = (byte)(int)(asc[0] << 2 | asc[1] << 2 >> 6); octetDecode[n++] = (byte)(int)(asc[1] << 4 | asc[2] << 2 >> 4); octetDecode[n++] = (byte)(int)(asc[2] << 6 | asc[3] << 2 >> 2); }//cTemp[0] = GetBase64Value((char)strSource[i]); //cTemp[1] = GetBase64Value((char)strSource[i+1]); //cTemp[2] = GetBase64Value((char)strSource[i+2]); //cTemp[3] = GetBase64Value((char)strSource[i+3]);//Length+=4; //if(Length==76) //{ // i+=2; // Length=0; //}//octetDecode[n++] = (cTemp[0] << 2) | (cTemp[1] >> 4); //octetDecode[n++] = (cTemp[1] << 4) | (cTemp[2] >> 2); //octetDecode[n++] = (cTemp[2] << 6) | (cTemp[3]);} *psize = n; return octetDecode; }。

windows2003 电脑操作系统乱码处理

windows2003 电脑操作系统乱码处理

4、使用WPS2000转换内码
WPS2000也能转换内码,支持GB2312、BIG5、GBK等三种主要的汉字编码,并可在输出RTF、TXT、HTM格式文件时对内码进行转换。
四、如何消除网页乱码?
【形成原因】:网页乱码是浏览器(IE等)对HTML网页解释时形成的,如果网页制作时编码为A,浏览器却以编码B显示该网页,就会出现乱码,因此只要你在浏览器中也以编码A显示该网页,就会消除乱码。
1、使用Word2003/XP转换内码
Word2003/XP支持众多的语言,可以正确显示非Unicode类型的文本文件,单击“工具”菜单下的“语言”/设置语言,你可以把默认语言设置成非中文,例如日语,这样Word就可以正确显示日文了。
当然你也可以用它进行简体中文与繁体中文之间的转换工作,如果文件有乱码,你转换一下即可消除。例如要把繁体中文转换为简体中文,方法是:选择要转换内码的文件,在弹出的对话框中,选择“其他编码”中的“繁体中文(BIG5)”一项,打开此文件时就不会出现乱码。
【解决办法】:只能由发件人解决。当发送8位格式的文本文件时,必须事先进行编码,将文件转换为7位ASCII码或更少位数的格式,然后才能保证文件的正确传送。收件人收到7位或更少位格式的邮件后,可以再转换为8位的格式,这样就可避免乱码。
3、收发端用的EMAIL软件和设置不同
一般EMAIL软件的"附件"功能都可以自动对信件先进行编码,然后送出。这样只要收信人使用的EMAIL软件(如Outlook XP等)能区别信件的编码方式,即可自动将信件解码。如果收发件人所用的EMAIL软件默认配置不同、收发件人自己定制的一些选项不同,在收到编码的信件后,系统就未必能识别出信件所用的编码方法,自然也无法自动解码,这样就会出现乱码。

base64 解码 原理

base64 解码 原理

base64 解码原理
Base64是一种编码方式,它将二进制数据转换为可打印字符
的ASCII格式。

其原理如下:
1. 将待编码的数据划分为连续的24位(即3个字节)的分组。

2. 将每个24位的分组划分为4个6位的子分组。

3. 根据Base64编码表,将每个6位的子分组转换为对应的可
打印字符。

4. 如果最后的输入数据长度不足3个字节,会进行填充操作。

一般使用'='字符进行填充。

这样,在Base64编码中,一个3字节的二进制数据通过编码
后会变成4个字符,并且编码后的数据长度总是为4的倍数。

当需要对Base64编码进行解码时,可以按照以下步骤进行:
1. 将待解码的数据划分为连续的4个字符的分组。

2. 根据Base64解码表,将每个字符的编码值转换为对应的6
位二进制数据。

3. 将每个6位的子分组合并为一个24位的分组。

4. 将每个24位的分组划分为3个8位的子分组,并转换为对
应的字节数据。

5. 如果解码后的数据长度大于待解码的数据长度,则剔除填充的字节。

通过以上步骤,就可以将Base64编码的数据解码回原始的二
进制数据。

需要注意的是,Base64编码只是一种编码方式,它并不对数
据进行加密或压缩。

它主要用于在文本协议中传输二进制数据,或者在文本环境中嵌入二进制数据。

base编码解码算法

base编码解码算法

Base64是一种对字符通过二进制进行编码解码转换的一种编码算法,便于在不同环境间通信,规避了乱码的出现。

具体来说,Base64编码算法将每3个字节24位的数据转化为4个字节32位的数据,从而获得76%的压缩率。

在Python中,可以使用标准库中的base64模块进行Base64的编码和解码。

以下是一个简单的示例:
python
import base64
# 编码
data = b'hello world'
encoded_data = base64.b64encode(data)
print(encoded_data) # 输出:b'aGVsbG8gd29ybGQh'
# 解码
decoded_data = base64.b64decode(encoded_data)
print(decoded_data) # 输出:b'hello world'
在这个例子中,我们首先导入了base64模块,然后定义了一个字符串data,它包含了一些二进制数据。

接着,我们使用base64.b64encode函数对数据进行编码,得到一个字节串encoded_data。

最后,我们使用base64.b64decode函数对字节串进行解码,得到原始的二进制数据。

中文邮件的编码

中文邮件的编码

使用java mail 包收发中文邮件的编码,解码问题以及解决方法JSP教程-邮件相关编码邮件头(参见RFC822,RFC2047)只能包含US-ASCII字符。

邮件头中任何包含非US-ASCII字符的部分必须进行编码,使其只包含US-ASCII字符。

所以使用java mail发送中文邮件必须经过编码,否则别人收到你的邮件只能是乱码一堆。

不过使用java mail 包的解决方法很简单,用它自带的MimeUtility工具中encode 开头的方法(如encodeText)对中文信息进行编码就可以了。

例子:MimeMessagemimeMsg = new MimeMessage(mailSession);//让javamail决定用什么方式来编码,编码内容的字符集是系统字符集mimeMsg.setSubject( MimeUtility.encodeText( Subject) );//使用指定的base64方式编码,并指定编码内容的字符集是gb2312mimeMsg.setSubject( MimeUtility.encodeText( S ubject,”gb2312”,”B”) );通常对邮件头的编码方式有2种,一种是base64方式编码,一种是QP(quoted-printable)方式编码,javamail根据具体情况来选择编码方式。

如“txt测试”编码后内容如下:=?GBK?Q?Txt=B2=E2=CA=D4里面有个=?GBK?Q?,GBK表示的是内容的字符集,?Q?表示的是以QP方式编码的,后面紧跟的才是编码后的中文字符。

所以用MimeUtility工具编码后的信息里包含了编码方式的信息。

邮件的正文也要进行编码,但它不能用MimeUtility里的方法来编码。

邮件正文的编码方式的信息是要放在Content-Transfer-Encoding这个邮件头参数中的,而MimeUtility里面的方法是将编码方式的信息放在编码后的正文内容中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#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 );
相关文档
最新文档