SMTP 写邮件客户端 但是不会base64加密 想学下SMTP 然后自己写个简单的邮件客户端,简单看了下SMTP的相关知识,感觉不是很难。但是不会base64加密算法,自己对加密知识是零基础。对与这种“零基础”,如何学习?有什么好的资料和书本推荐下吗?谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 base64 可以使用搜索引擎查找 RFC 文档 http://download.csdn.net/source/2853248 base64编码很简单的啊const char EnBase64Tab[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; int EncodeBase64(const unsigned char* pSrc, char* pDst, int nSrcLen){ unsigned char c1, c2, c3; // 输入缓冲区读出3个字节 int nDstLen = 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) | (c2 >> 4)) & 0x3f]; *pDst++ = EnBase64Tab[((c2 << 2) | (c3 >> 6)) & 0x3f]; *pDst++ = EnBase64Tab[c3 & 0x3f]; nDstLen += 4; } // 编码余下的字节 if (nMod == 1) { c1 = *pSrc++; *pDst++ = EnBase64Tab[(c1 & 0xfc) >> 2]; *pDst++ = EnBase64Tab[((c1 & 0x03) << 4)]; *pDst++ = '='; *pDst++ = '='; nDstLen += 4; } else if (nMod == 2) { c1 = *pSrc++; c2 = *pSrc++; *pDst++ = EnBase64Tab[(c1 & 0xfc) >> 2]; *pDst++ = EnBase64Tab[((c1 & 0x03) << 4) | ((c2 & 0xf0) >> 4)]; *pDst++ = EnBase64Tab[((c2 & 0x0f) << 2)]; *pDst++ = '='; nDstLen += 4; } // 输出加个结束符 *pDst = '\0'; return nDstLen;}const char DeBase64Tab[] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x17 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x18-0x2a 62, // '+' 0x2B 0, 0, 0, //0x2c-2e 63, // '/' 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9' 0x30-39 0, 0, 0, 0, 0, 0, 0, //0x3A-40 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, //0x41-4D 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z' 0x4E-5A 0, 0, 0, 0, 0, 0, //0x5B-60 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, //0x61- 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'}; int DecodeBase64(const char* pSrc, unsigned char* pDst, int nSrcLen){ unsigned char c1, c2, c3, c4; // 输入缓冲区读出4个字节 unsigned char lc1, lc2; int nDstLen = 0; // 输出的字符计数 int nDiv = nSrcLen / 4; // 输入数据长度除以4得到的倍数 // 每次取4个字节,解码成3个字符 for (int i = 0; i < nDiv; i ++) { // 取4个字节 c1 = DeBase64Tab[*pSrc++]; c2 = DeBase64Tab[*pSrc++]; lc1 = *pSrc; c3 = DeBase64Tab[*pSrc++]; lc2 = *pSrc; c4 = DeBase64Tab[*pSrc++]; if (lc2 == '=') { if (lc1 == '=') { //原文中除3后余数是1 c3 = 0; c4 = 0; *pDst++ = (c1 << 2) | (c2 >> 4); nDstLen += 1; } else { //原文中除3后余数是2 c4 = 0; *pDst++ = (c1 << 2) | (c2 >> 4); *pDst++ = (c2 << 4) | (c3 >> 2); nDstLen += 2; } break; } // 解码成3个字符 *pDst++ = (c1 << 2) | (c2 >> 4); *pDst++ = (c2 << 4) | (c3 >> 2); *pDst++ = (c3 << 6) | c4; nDstLen += 3; } // 输出加个结束符 *pDst = '\0'; return nDstLen;} 颜色编辑器是如何实现的? Debug和Release版本运行速度相差太大的问题 使用ado连接数据库打包时候需要添加msado15.dll吗 <游戏编程大师技巧>里提供的读24位BMP函数的问题!! ATL::CString在dll中使用问题 如何设置CListCtrl中复选框选中和不选中呢? 怎样做才能控制打印机只打印某个选中的打印任务?? 对象建立的顺序问题? vc的程序,怎么做到多个对话框之间互相切换? 关闭线程的问题! mfc中工具栏 可编辑列表框当中,为什么这样设置就会出错误?
int EncodeBase64(const unsigned char* pSrc, char* pDst, int nSrcLen)
{
unsigned char c1, c2, c3; // 输入缓冲区读出3个字节
int nDstLen = 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) | (c2 >> 4)) & 0x3f];
*pDst++ = EnBase64Tab[((c2 << 2) | (c3 >> 6)) & 0x3f];
*pDst++ = EnBase64Tab[c3 & 0x3f];
nDstLen += 4;
}
// 编码余下的字节
if (nMod == 1)
{
c1 = *pSrc++;
*pDst++ = EnBase64Tab[(c1 & 0xfc) >> 2];
*pDst++ = EnBase64Tab[((c1 & 0x03) << 4)];
*pDst++ = '=';
*pDst++ = '=';
nDstLen += 4;
}
else if (nMod == 2)
{
c1 = *pSrc++;
c2 = *pSrc++;
*pDst++ = EnBase64Tab[(c1 & 0xfc) >> 2];
*pDst++ = EnBase64Tab[((c1 & 0x03) << 4) | ((c2 & 0xf0) >> 4)];
*pDst++ = EnBase64Tab[((c2 & 0x0f) << 2)];
*pDst++ = '=';
nDstLen += 4;
}
// 输出加个结束符
*pDst = '\0';
return nDstLen;
}
const char DeBase64Tab[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x17
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x18-0x2a
62, // '+' 0x2B
0, 0, 0, //0x2c-2e
63, // '/'
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9' 0x30-39
0, 0, 0, 0, 0, 0, 0, //0x3A-40
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, //0x41-4D
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z' 0x4E-5A
0, 0, 0, 0, 0, 0, //0x5B-60
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, //0x61-
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
};
int DecodeBase64(const char* pSrc, unsigned char* pDst, int nSrcLen)
{
unsigned char c1, c2, c3, c4; // 输入缓冲区读出4个字节
unsigned char lc1, lc2;
int nDstLen = 0; // 输出的字符计数
int nDiv = nSrcLen / 4; // 输入数据长度除以4得到的倍数
// 每次取4个字节,解码成3个字符
for (int i = 0; i < nDiv; i ++)
{
// 取4个字节
c1 = DeBase64Tab[*pSrc++];
c2 = DeBase64Tab[*pSrc++];
lc1 = *pSrc;
c3 = DeBase64Tab[*pSrc++];
lc2 = *pSrc;
c4 = DeBase64Tab[*pSrc++];
if (lc2 == '=')
{
if (lc1 == '=')
{ //原文中除3后余数是1
c3 = 0;
c4 = 0;
*pDst++ = (c1 << 2) | (c2 >> 4);
nDstLen += 1;
}
else
{ //原文中除3后余数是2
c4 = 0;
*pDst++ = (c1 << 2) | (c2 >> 4);
*pDst++ = (c2 << 4) | (c3 >> 2);
nDstLen += 2;
}
break;
} // 解码成3个字符
*pDst++ = (c1 << 2) | (c2 >> 4);
*pDst++ = (c2 << 4) | (c3 >> 2);
*pDst++ = (c3 << 6) | c4; nDstLen += 3;
}
// 输出加个结束符
*pDst = '\0';
return nDstLen;
}