织梦CMS - 轻松建站从此开始!

罗索

Visual C++-MIME之Quoted-Printable编解码

jackyhwei 发布于 2011-09-27 11:24 点击:次 
Quoted-Printable编码的基本方法是:输入数据在33-60、62-126范围内的,直接输出;其它的需编码为“=”加两个字节的HEX码(大写)。为保证输出行不超过规定长度,可在行尾加“=\r\n”序列作为软回车。
TAG:

Quoted-Printable也是MIME邮件中常用的编码方式之一。同Base64一样,它也将输入的字符串或数据编码成全是ASCII码的可打印字符串。

Quoted-Printable编码的基本方法是:输入数据在33-60、62-126范围内的,直接输出;其它的需编码为“=”加两个字节的HEX码(大写)。为保证输出行不超过规定长度,可在行尾加“=\r\n”序列作为软回车。

  1. int EncodeQuoted(const unsigned char* pSrc, char* pDst, int nSrcLen, int nMaxLineLen) 
  2.     int nDstLen;        // 输出的字符计数 
  3.     int nLineLen;       // 输出的行长度计数 
  4.   
  5.     nDstLen = 0; 
  6.     nLineLen = 0; 
  7.   
  8.     for (int i = 0; i < nSrcLen; i++, pSrc++) 
  9.     { 
  10.         // ASCII 33-60, 62-126原样输出,其余的需编码 
  11.         if ((*pSrc >= '!') && (*pSrc <= '~') && (*pSrc != '=')) 
  12.         { 
  13.             *pDst++ = (char)*pSrc; 
  14.             nDstLen++; 
  15.             nLineLen++; 
  16.         } 
  17.         else 
  18.         { 
  19.             sprintf(pDst, "=%02X", *pSrc); 
  20.             pDst += 3; 
  21.             nDstLen += 3; 
  22.             nLineLen += 3; 
  23.         } 
  24.   
  25.         // 输出换行? 
  26.         if (nLineLen >= nMaxLineLen - 3) 
  27.         { 
  28.             sprintf(pDst, "=\r\n"); 
  29.             pDst += 3; 
  30.             nDstLen += 3; 
  31.             nLineLen = 0; 
  32.         } 
  33.     } 
  34.   
  35.     // 输出加个结束符 
  36.     *pDst = '\0'
  37.   
  38.     return nDstLen; 

Quoted-Printable解码很简单,将编码过程反过来就行了。

  1. int DecodeQuoted(const char* pSrc, unsigned char* pDst, int nSrcLen) 
  2.     int nDstLen;        // 输出的字符计数 
  3.     int i; 
  4.   
  5.     i = 0; 
  6.     nDstLen = 0; 
  7.   
  8.     while (i < nSrcLen) 
  9.     { 
  10.         if (strncmp(pSrc, "=\r\n", 3) == 0)        // 软回车,跳过 
  11.         { 
  12.             pSrc += 3; 
  13.             i += 3; 
  14.         } 
  15.         else 
  16.         { 
  17.             if (*pSrc == '=')        // 是编码字节 
  18.             { 
  19.                 sscanf(pSrc, "=%02X", pDst); 
  20.                 pDst++; 
  21.                 pSrc += 3; 
  22.                 i += 3; 
  23.             } 
  24.             else        // 非编码字节 
  25.             { 
  26.                 *pDst++ = (unsigned char)*pSrc++; 
  27.                 i++; 
  28.             } 
  29.   
  30.             nDstLen++; 
  31.         } 
  32.     } 
  33.   
  34.     // 输出加个结束符 
  35.     *pDst = '\0'
  36.   
  37.     return nDstLen; 
(cr0_3)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201109/15056.html]
本文出处:hi.baidu.com/cr0_3 作者:cr0_3
顶一下
(3)
100%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容