求份BASE64代码~~~~~~~~~~~~

li3seyy 2009-05-18 09:39:32
求份BASE64代码~~~~~~~~~~~~
...全文
33 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsupper 2009-05-18
  • 打赏
  • 举报
回复
/////////////////////////////////////////////////////////////
//Base64.cpp
////////////////////////////////
#include <string.h>
#include "SH_Base64.h"
////////////////////////////////

int SH_EncodeBase64(char *pASCSrc,char *pBase64Res)
{ int srcLen;
char cMap[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char *pCurSrc,*pCurRes;
int i,j,k,group;
char ch_Asc[4],ch_Base[4],ch,cha;

if(!pASCSrc || !pBase64Res) return -1;

srcLen = strlen(pASCSrc);
if(srcLen<1)
{ *pBase64Res = 0;
return -1;
}

group = srcLen/3;
i = 0;
pCurSrc = pASCSrc;
pCurRes = pBase64Res;

while(i<group)
{ for(j=0;j<3;j++)
{ if(pCurSrc[j]!=0)
{ ch_Asc[j] = *(pCurSrc+j);
}
else
{ for(k=j;k<4;k++)
{ ch_Asc[k] = 0;
}
}
}
ch_Base[0] = ((ch_Asc[0]>>2)&0x3f);
*pCurRes = cMap[ch_Base[0]];

ch_Base[1] = ((ch_Asc[0]<<4)&0x30);
ch_Base[1] += ((ch_Asc[1]>>4)&0x0f);
*(pCurRes+1) = cMap[ch_Base[1]];

ch_Base[2] = (ch_Asc[1]<<2)&0x3c;
ch_Base[2] += ((ch_Asc[2]>>6)&0x03);
*(pCurRes+2) = cMap[ch_Base[2]];

ch_Base[3] = (ch_Asc[2]&0x3f);
*(pCurRes+3) = cMap[ch_Base[3]];

i++;
pCurSrc+=3;
pCurRes+=4;
}

if((srcLen%3) == 1)
{ ch = *pCurSrc;
ch = ch>>2;
ch = ch&(0x3f);
*(pCurRes++) = cMap[ch];

ch = *pCurSrc;
ch = ch<<4;
ch = ch&(0x30);
*(pCurRes++) = cMap[ch];

*(pCurRes++) = '=';
*(pCurRes++) = '=';
*pCurRes = 0;
}
else if((srcLen%3) == 2)
{ ch = *pCurSrc;
ch = (ch>>2);
ch = ch&(0x3f);
*(pCurRes++) = cMap[ch];

ch = *pCurSrc;
cha = *(pCurSrc+1);
ch = ch<<4;
ch = ch&(0x30);
cha = (cha>>4);
cha = cha&(0x0f);
cha += ch;
*(pCurRes++) = cMap[cha];

ch = *(pCurSrc+1);
ch = ch<<2;
ch = (ch&(0x3c));
*(pCurRes++) = cMap[ch];
*(pCurRes++) = '=';
*pCurRes = 0;
}
else
*pCurRes = 0;
return 1;
}

int SH_DecodeBase64(char *pBase64Src,char *pASCRes)
{ int srcLen;
char cMap[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char *pCurSrc,*pCurRes;
int i=0,j,group;
char ch[4],ch_Asc[4];

srcLen = strlen(pBase64Src);
if(srcLen % 4 != 0)
{ *pASCRes = 0;
return -1;
}

group = srcLen/4;
pCurSrc = pBase64Src;
pCurRes = pASCRes;

do
{ for(j=0;j<4;j++)
{ ch[j] = *(pCurSrc+j);

if(ch[j]>='A' && ch[j]<='Z')
{ ch_Asc[j] = ch[j] - 'A';
}
else if(ch[j]>='a' && ch[j]<='z')
{ ch_Asc[j] = ch[j] -'a' + 26;
}
else if(ch[j]>='0' && ch[j]<='9')
{ ch_Asc[j] = ch[j] - '0' + 52;
}
else if(ch[j] == '+')
{ ch_Asc[j] = 62;
}
else if(ch[j] == '/')
{ ch_Asc[j] = 63;
}
else if(ch[j] == '=')
{ ch_Asc[j] = '=';
}
else
{ *pASCRes = 0;
return -1;
}
}
*pCurRes = (ch_Asc[0]<<2) + (((ch_Asc[1]&0x30)>>4)&0x0f);

if(ch[2]!='=')
*(pCurRes+1) = ((ch_Asc[1]&0x0f)<<4) + (((ch_Asc[2]&0x3c)>>2)&0x3f);
else
{ *(pCurRes+1) = (ch_Asc[1]&0x0f)<<4;
*(pCurRes+2) = 0;
return 1;
}
if(ch[3]!='=')
*(pCurRes+2) = ((ch_Asc[2]&0x03)<<6) + ch_Asc[3];
else
{ *(pCurRes+2) = (ch_Asc[2]&0x03)<<6;
*(pCurRes+3) = 0;
return 1;
}
i++;
pCurRes += 3;
pCurSrc += 4;

}while(i<group);
*(pCurRes) = 0;
return 1;
}

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧