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; }
.