[原创]VC实现Base64编码范例
来源:互联网 发布:最新网络赚钱项目 编辑:程序博客网 时间:2024/05/17 09:20
BOOL CEDCoder::EncodeBase64(const char *pszIn, int nInLen, char *pszOut, int nOutSize, int *nOutLen)
{
ASSERT(pszIn);
ASSERT(pszOut);
ASSERT(nOutSize);
ASSERT(nOutSize >= Base64BufferSize(nInLen));
#ifndef _DEBUG
nOutSize;
#endif
//初始化编码过程中的循环变量
int nInPos = 0;
int nOutPos = 0;
int nLineLen = 0;
//一次从源串中取得三个字符并编码
for( int i=0 ; i<nInLen/3 ; i++)
{
//取得三个字符
int c1 = pszIn[nInPos++]&0xFF;
int c2 = pszIn[nInPos++]&0xFF;
int c3 = pszIn[nInPos++]&0xFF;
//将三个字符进行Base64编码
pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
pszOut[nOutPos++] = m_base64tab[((c1&0x03)<<4)|((c2&0xF0)>>4)];
pszOut[nOutPos++] = m_base64tab[((c2&0x0F)<<2)|((c3&0xC0)>>6)];
pszOut[nOutPos++] = m_base64tab[c3&0x3F];
nLineLen += 4;
//处理行数越界的情况
if(nLineLen >= BASE64_MAXLINE-3)
{
char* cp = EOL;
pszOut[nOutPos++] = *cp++;
if(*cp)
pszOut[nOutPos++] = *cp;
nLineLen = 0;
}
}
//处理剩余的1或2个字符
char* cp;
switch(nInLen%3)
{
case 0:
{
cp = EOL;
pszOut[nOutPos++] = *cp++;
if(*cp)
pszOut[nOutPos] = *cp;
break;
}
case 1:
{
int c1 = pszIn[nInPos]&0xFF;
pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
pszOut[nOutPos++] = m_base64tab[(c1&0x03)<<4];
pszOut[nOutPos++] = '=';
pszOut[nOutPos++] = '=';
cp = EOL;
pszOut[nOutPos++] = *cp++;
if(*cp)
pszOut[nOutPos++] = *cp;
break;
}
case 2:
{
int c1 = pszIn[nInPos++]&0xFF;
int c2 = pszIn[nInPos]&0xFF;
pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
pszOut[nOutPos++] = m_base64tab[((c1&0x03)<<4)|((c2&0xF0)>>4)];
pszOut[nOutPos++] = m_base64tab[(c2&0x0F)<<2];
pszOut[nOutPos++] = '=';
cp = EOL;
pszOut[nOutPos++] = *cp++;
if(*cp)
pszOut[nOutPos++] = *cp;
break;
}
default:
{
//出错了!!
ASSERT(FALSE);
break;
}
}
pszOut[nOutPos] = 0;
*nOutLen = nOutPos;
return TRUE;
}
{
ASSERT(pszIn);
ASSERT(pszOut);
ASSERT(nOutSize);
ASSERT(nOutSize >= Base64BufferSize(nInLen));
#ifndef _DEBUG
nOutSize;
#endif
//初始化编码过程中的循环变量
int nInPos = 0;
int nOutPos = 0;
int nLineLen = 0;
//一次从源串中取得三个字符并编码
for( int i=0 ; i<nInLen/3 ; i++)
{
//取得三个字符
int c1 = pszIn[nInPos++]&0xFF;
int c2 = pszIn[nInPos++]&0xFF;
int c3 = pszIn[nInPos++]&0xFF;
//将三个字符进行Base64编码
pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
pszOut[nOutPos++] = m_base64tab[((c1&0x03)<<4)|((c2&0xF0)>>4)];
pszOut[nOutPos++] = m_base64tab[((c2&0x0F)<<2)|((c3&0xC0)>>6)];
pszOut[nOutPos++] = m_base64tab[c3&0x3F];
nLineLen += 4;
//处理行数越界的情况
if(nLineLen >= BASE64_MAXLINE-3)
{
char* cp = EOL;
pszOut[nOutPos++] = *cp++;
if(*cp)
pszOut[nOutPos++] = *cp;
nLineLen = 0;
}
}
//处理剩余的1或2个字符
char* cp;
switch(nInLen%3)
{
case 0:
{
cp = EOL;
pszOut[nOutPos++] = *cp++;
if(*cp)
pszOut[nOutPos] = *cp;
break;
}
case 1:
{
int c1 = pszIn[nInPos]&0xFF;
pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
pszOut[nOutPos++] = m_base64tab[(c1&0x03)<<4];
pszOut[nOutPos++] = '=';
pszOut[nOutPos++] = '=';
cp = EOL;
pszOut[nOutPos++] = *cp++;
if(*cp)
pszOut[nOutPos++] = *cp;
break;
}
case 2:
{
int c1 = pszIn[nInPos++]&0xFF;
int c2 = pszIn[nInPos]&0xFF;
pszOut[nOutPos++] = m_base64tab[(c1&0xFC)>>2];
pszOut[nOutPos++] = m_base64tab[((c1&0x03)<<4)|((c2&0xF0)>>4)];
pszOut[nOutPos++] = m_base64tab[(c2&0x0F)<<2];
pszOut[nOutPos++] = '=';
cp = EOL;
pszOut[nOutPos++] = *cp++;
if(*cp)
pszOut[nOutPos++] = *cp;
break;
}
default:
{
//出错了!!
ASSERT(FALSE);
break;
}
}
pszOut[nOutPos] = 0;
*nOutLen = nOutPos;
return TRUE;
}
- [原创]VC实现Base64编码范例
- VC++网络安全编程范例(9)-基于OPENSSL实现对称算法与BASE64编码
- VC++网络安全编程范例(9)-基于OPENSSL实现对称算法与BASE64编码
- Base64编码java实现
- java实现base64编码
- Base64编码----C++实现
- Base64编码实现-3
- python 实现base64编码
- BASE64编码 C实现
- java实现base64编码
- base64解码和编码范例(iPhone和Mac通用)
- BASE64编码和解码(VC源代码)
- BASE64编码和解码(VC源代码)
- BASE64编码和解码(VC源代码)
- 用asp实现base64编码
- VB6实现Base64编码/解码
- Base64编码解码与实现
- Base64编码、解码的实现
- 逻辑嵌套语句/对于Login界面的引申
- 千万别吃着别人,骂着别人
- 倒霉的一天
- java代码编写的30条建意
- 软件开发中的测试方法
- [原创]VC实现Base64编码范例
- 访问被拒绝。未能开始监视文件更改。
- VB ADO 用二进制方式来读写文件 入数据库 __________请参考(把文件(包括图片)存入数据库)
- Servlet tips --init(), destroy() and retrieving information
- 学习笔记之其它
- ftp 多线程下载的设计与实现
- 课程设计(2006.4.19草稿)
- 看看 Vista 的标志
- 我的Struts+Spring+Hibernate 框架