MIME之Base64编解码

类别:VC语言 点击:0 评论:0 推荐:
P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 5px; LINE-HEIGHT: normal; PADDING-TOP: 0px; FONT-FAMILY: Verdana, Arial } PRE.bhw98 { FONT-SIZE: 9pt; PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px 0px; LINE-HEIGHT: normal; PADDING-TOP: 5px; BACKGROUND-COLOR: #f0f0f0 } PRE.diag { FONT-SIZE: 9pt; PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px 0px; LINE-HEIGHT: normal; PADDING-TOP: 5px; } CODE.bhw98 { FONT-SIZE: 9pt; COLOR: #000000 } TABLE.bhw98 { BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; FONT-SIZE: 9pt; MARGIN: 3px 0px 10px; BORDER-LEFT: #808080 1px solid; LINE-HEIGHT: normal; BORDER-BOTTOM: #808080 1px solid; FONT-FAMILY: Verdana, Arial } TD.bhw98 { BORDER-RIGHT: darkgray 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: darkgray 1px solid; PADDING-LEFT: 5px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: darkgray 1px solid; LINE-HEIGHT: normal; PADDING-TOP: 3px; BORDER-BOTTOM: darkgray 1px solid; FONT-FAMILY: Verdana, Arial; BACKGROUND-COLOR: #f0f0f0 } STRONG.bhw98 { FONT-WEIGHT: bolder; FONT-SIZE: 20pt; COLOR: #228b22; FONT-STYLE: italic; FONT-FAMILY: Verdana, Arial } LI.bhw98 { FONT-SIZE: 9pt; MARGIN: 3px 0px 0px 3px; LINE-HEIGHT: normal; FONT-FAMILY: Verdana, Arial } H1.bhw98 { MARGIN-TOP: 25px; FONT-WEIGHT: bolder; FONT-SIZE: 12pt; MARGIN-BOTTOM: 5px; LINE-HEIGHT: normal; FONT-FAMILY: Verdana, Arial } H2.bhw98 { MARGIN-TOP: 20px; FONT-WEIGHT: bolder; FONT-SIZE: 10.5pt; MARGIN-BOTTOM: 5px; LINE-HEIGHT: normal; FONT-FAMILY: Verdana, Arial } H3.bhw98 { MARGIN-TOP: 15px; FONT-WEIGHT: bolder; FONT-SIZE: 9pt; MARGIN-BOTTOM: 5px; LINE-HEIGHT: normal; FONT-FAMILY: Verdana, Arial } SPAN.key { COLOR: #0000ff } SPAN.num { COLOR: #800000 } SPAN.str { COLOR: #8b008b } SPAN.rem { COLOR: #008000 }

Base64是MIME邮件中常用的编码方式之一。它的主要思想是将输入的字符串或数据编码成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}这64个可打印字符的串,故称为“Base64”。

Base64编码的方法是,将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以'='填充。

const char EnBase64Tab[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int EncodeBase64(const unsigned char* pSrc, char* pDst, int nSrcLen, int nMaxLineLen) { unsigned char c1, c2, c3; // 输入缓冲区读出3个字节 int nDstLen = 0; // 输出的字符计数 int nLineLen = 0; // 输出的行长度计数 int nDiv = nSrcLen / 3; // 输入数据长度除以3得到的倍数 int nMod = nSrcLen % 3; // 输入数据长度除以3得到的余数 // 每次取3个字节,编码成4个字符 for (int i = 0; i < nDiv; i ++) { // 取3个字节 c1 = *pSrc++; c2 = *pSrc++; c3 = *pSrc++; // 编码成4个字符 *pDst++ = EnBase64Tab[c1 >> 2]; *pDst++ = EnBase64Tab[((c1 > 4)) & 0x3f]; *pDst++ = EnBase64Tab[((c2 > 6)) & 0x3f]; *pDst++ = EnBase64Tab[c3 & 0x3f]; nLineLen += 4; nDstLen += 4; // 输出换行? if (nLineLen > nMaxLineLen - 4) { *pDst++ = '\r'; *pDst++ = '\n'; nLineLen = 0; nDstLen += 2; } } // 编码余下的字节 if (nMod == 1) { c1 = *pSrc++; *pDst++ = EnBase64Tab[(c1 & 0xfc) >> 2]; *pDst++ = EnBase64Tab[((c1 & 0x03) > 2]; *pDst++ = EnBase64Tab[((c1 & 0x03) > 4)]; *pDst++ = EnBase64Tab[((c2 & 0x0f) 8; nDstLen++; if (*pSrc != '=') { nValue += DeBase64Tab[*pSrc++]; *pDst++ =nValue & 0x000000ff; nDstLen++; } } i += 4; } else // 回车换行,跳过 { pSrc++; i++; } } // 输出加个结束符 *pDst = '\0'; return nDstLen; }

  [相关资源] RFC/STD文档:Internet FAQ Archives bhw98的专栏:http://www.csdn.net/develop/author/netauthor/bhw98/

首次发布: 2003-06-23
最后修订: 2003-07-21

 

本文地址:http://com.8s8s.com/it/it1698.htm