Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1092340
  • 博文数量: 252
  • 博客积分: 4561
  • 博客等级: 上校
  • 技术积分: 2833
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-15 08:23
文章分类

全部博文(252)

文章存档

2015年(2)

2014年(1)

2013年(1)

2012年(16)

2011年(42)

2010年(67)

2009年(87)

2008年(36)

分类: LINUX

2011-05-27 15:57:44

Quoted-Printable也是MIME邮件中常用的编码方式之一。同Base64一样,它也将输入的字符串或数据编码成全是ASCII码的可打印字符串。
  Quoted-Printable编码的基本方法是:输入数据在33-60、62-126范围内的,直接输出;其它的需编码为“=”加两个字节的HEX码(大写)。为保证输出行不超过规定长度,可在行尾加“=\r\n”序列作为软回车。
  int EncodeQuoted(const unsigned char* pSrc, char* pDst, int nSrcLen, int nMaxLineLen)
  {
   int nDstLen; // 输出的字符计数
   int nLineLen; // 输出的行长度计数
   nDstLen = 0;
   nLineLen = 0;
   for (int i = 0; i < nSrcLen; i++, pSrc++)
   {
   // ASCII 33-60, 62-126原样输出,其余的需编码
   if ((*pSrc = '!') && (*pSrc '~') && (*pSrc != '='))
   {
   *pDst++ = (char)*pSrc;
   nDstLen++;
   nLineLen++;
   }
   else
   {
   sprintf(pDst, "=%02X", *pSrc);
   pDst += 3;
   nDstLen += 3;
   nLineLen += 3;
   }
   // 输出换行?
   if (nLineLen = nMaxLineLen - 3)
   {
   sprintf(pDst, "=\r\n");
   pDst += 3;
   nDstLen += 3;
   nLineLen = 0;
   }
   }
   // 输出加个结束符
   *pDst = '\0';
   return nDstLen;
  }
  Quoted-Printable解码很简单,将编码过程反过来就行了。
  int DecodeQuoted(const char* pSrc, unsigned char* pDst, int nSrcLen)
  {
   int nDstLen; // 输出的字符计数
   int i;
   i = 0;
   nDstLen = 0;
   while (i < nSrcLen)
   {
   if (strncmp(pSrc, "=\r\n", 3) == 0) // 软回车,跳过
   {
   pSrc += 3;
   i += 3;
   }
   else
   {
   if (*pSrc == '=') // 是编码字节
   {
   sscanf(pSrc, "=%02X", pDst);
   pDst++;
   pSrc += 3;
   i += 3;
   }
   else // 非编码字节
   {
   *pDst++ = (unsigned char)*pSrc++;
   i++;
   }
  
   nDstLen++;
   }
   }
   // 输出加个结束符
   *pDst = '\0';
   return nDstLen;
  }
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/windflow/archive/2008/11/17/3318066.aspx
阅读(907) | 评论(0) | 转发(0) |
0

上一篇:zlib用法

下一篇:multicast example

给主人留下些什么吧!~~