Base64编码解码和URLEnocde编码解码的C实现

来源:互联网 发布:淘宝网童装女保暖外套 编辑:程序博客网 时间:2024/04/30 22:25
* base64编码函数 */

int base64(char *s,char *d)
{
char CharSet[64]={
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'};
unsigned char In[3];
unsigned char Out[4];
int cnt=0;

if(!s||!d) return 0;

for(;*s!=0;)
{
if(cnt+4>76)
{
*d++='/n';
cnt=0;
}
if(strlen(s)>=3)
{
In[0]=*s;
In[1]=*(s+1);
In[2]=*(s+2);
Out[0]=In[0]>>2;
Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
Out[2]=(In[1]&0x0f)<<2|(In[2]&0xc0)>>6;
Out[3]=In[2]&0x3f;
*d=CharSet[Out[0]];
*(d+1)=CharSet[Out[1]];
*(d+2)=CharSet[Out[2]];
*(d+3)=CharSet[Out[3]];
s+=3;
d+=4;
}
else if(strlen(s)==1)
{
In[0]=*s;
Out[0]=In[0]>>2;
Out[1]=(In[0]&0x03)<<4|0;
*d=CharSet[Out[0]];
*(d+1)=CharSet[Out[1]];
*(d+2)='=';
*(d+3)='=';
s+=1;
d+=4;
}
else if(strlen(s)==2)
{
In[0]=*s;
In[1]=*(s+1);
Out[0]=In[0]>>2;
Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
Out[2]=(In[1]&0x0f)<<2|0;
*d=CharSet[Out[0]];
*(d+1)=CharSet[Out[1]];
*(d+2)=CharSet[Out[2]];
*(d+3)='=';
s+=2;
d+=4;
}
cnt+=4;
}
*d='/0';
return 1;
}



/* base64解码函数 */

int unbase64char(char ch)
{
char CharSet[64]={
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'};
int i;
for(i=0;i<=63;i++) if(CharSet[i]==ch) break;
return i;
}

int unbase64(char *s,char *d)
{
unsigned char In[4];
unsigned char Out[3];

if(!s||!d) return 0;

for(;*s!=0;)
{
if(*s=='/n') s++;
In[0]=s[0];
In[1]=s[1];
In[2]=s[2];
In[3]=s[3];
if(In[2]!='='&&In[3]!='=')
{
In[0]=unbase64char(In[0]);
In[1]=unbase64char(In[1]);
In[2]=unbase64char(In[2]);
In[3]=unbase64char(In[3]);
Out[0]=In[0]<<2|(In[1]&0x30)>>4;
Out[1]=(In[1]&0x0f)<<4|(In[2]&0x3c)>>2;
Out[2]=(In[2]&0x03)<<6|In[3]&0x3f;
d[0]=Out[0];
d[1]=Out[1];
d[2]=Out[2];
s+=4;
d+=3;
}
else if(In[2]=='='&&In[3]=='=')
{
In[0]=unbase64char(In[0]);
In[1]=unbase64char(In[1]);
Out[0]=In[0]<<2|(In[1]&0x30)>>4;
d[0]=Out[0];
s+=4;
d+=1;
}
else if(In[2]!='='&&In[3]=='=')
{
In[0]=unbase64char(In[0]);
In[1]=unbase64char(In[1]);
In[2]=unbase64char(In[2]);
Out[0]=In[0]<<2|(In[1]&0x30)>>4;
Out[1]=(In[1]&0x0f)<<4|(In[2]&0x3c)>>2;
d[0]=Out[0];
d[1]=Out[1];
s+=4;
d+=2;
}
}
*d='/0';
return 1;
}





/* Unencode URL编码函数 */
/*
在这里要注意,编译器在处理中文字符时,会自动根据字符的位7来读入一个
或两个字符,这时可以强制采用unsigned char *来读入一个字符。可以看下
面isT()的用法
*/

int isT(char ch)
{
// unsigned char *p=(unsigned char*)&ch;
// if(*p==' '||*p=='='||*p=='%'||*p=='.'||*p=='/'||*p>126) return 1;
// else return 0;
if(ch==' '||ch=='='||ch=='%'||ch=='.'||ch=='/'||ch&0x80) return 1;
else return 0;
}

int encode(char *s,char *d)
{
if(!s||!d) return 0;
for(;*s!=0;s++)
{
unsigned char *p=(unsigned char*)s;
if(*p==' ')
{
*d='+';
d++;
}
else if(isT(*p))
{
char a[3];
*d='%';
sprintf(a,"%02x",*p);
*(d+1)=a[0];
*(d+2)=a[1];
d+=3;
}
else
{
*d=*p;
d++;
}
}
*d=0;
return 1;
}


/* Unencode URL解码函数 */

int unencode(char *s,char *d)
{
if(!s||!d) return 0;
for(;*s!=0;s++)
{
if(*s=='+')
{
*d=' ';
d++;
}
else if(*s=='%')
{
int code;
if(sscanf(s+1,"%02x",&code)!=1) code='?';
*d=code;
s+=2;
d++;
}
else
{
*d=*s;
d++;
}
}
*d=0;
return 1;
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗舔了结痂伤口怎么办 狗狗指甲变黑了怎么办 狗狗不肯剪指甲怎么办 厕所门对厨房门怎么办 房间门对着镜子怎么办 门直对着楼梯口怎么办 厨房门对着客厅怎么办 卧室正对着马路怎么办 主卧厕所对着床怎么办 卧室门对着床头怎么办 主卧厕所门对床怎么办 老人晕车怎么办最有效方法 货车油刹不好用怎么办 7岁儿童喉咙有痰怎么办 3岁宝宝喉咙有痰怎么办 冰箱正对厨房门怎么办 买了连廊高层怎么办 想买电玩瑞文怎么办 财位旁边有窗户怎么办 入室门对卧室门怎么办 卧室门对着大门怎么办 床给别人睡过了怎么办 镜子对着书房门怎么办 次卧对着卫生间怎么办 一楼房间太潮湿怎么办 房间里潮湿很重怎么办 儿童眼屎多又黄怎么办 地铁旁房子很吵怎么办 租的房子隔音差怎么办 花园洋房买了2楼怎么办 路由器wan口坏了怎么办 卧室有横梁压床怎么办 买了13层的房子怎么办 买了运费险换货怎么办 运费险一直没退怎么办 属相与日子相冲怎么办 人身上阴气太重怎么办 商标被异议了该怎么办 种植的眉毛很乱怎么办 眉中间有八字纹怎么办 眉毛离眼睛太远怎么办