《编程思维与实践》1047.Base64编码
题目
思路
注意的点:
代码
#include<stdio.h>
#include<string.h>
char chart[66]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}; //'='编码记为64
int main()
{
int T;
scanf("%d",&T);
for(int t=0;t<T;t++)
{
char s[101];
scanf("%s",s);
char ans[300]; //answer 存Base64编码
printf("case #%d:\n",t);
int j=0,cnt=0; //j为ans指标 cnt记录读几个字符
for(int i=0;i<strlen(s);i++)
{
if(cnt==0) //处理每三个字符中的第一个
{
ans[j++]=s[i]>>2; //第一个Base64 开头直接++
ans[j]=(s[i]%4)<<4; //第二个Base64的前半部分
}
else if(cnt==1) //处理第二个
{
ans[j++]+=s[i]>>4; //第二个Base64的后半部分
ans[j]=(s[i]%16)<<2; //第三个Base64的前半部分
}
else //处理第三个
{
ans[j++]+=s[i]>>6; //第三个Base64的后半部分
ans[j++]=s[i]%64; //第四个Base64 最后一个也++
}
cnt=(++cnt)%3; //注意这里要先自增再模3 每3次cnt更新重置为0
}
if(cnt==1) //剩一个字符
{
j++; //因为只读前半部分没有++ 所以需要人为++
ans[j++]=64; //补两个'='
ans[j++]=64;
}
else if(cnt==2) //剩两个字符
{
j++; //因为只读前半部分没有++ 所以需要人为++
ans[j++]=64;
}
for(int i=0;i<j;i++)
{
printf("%c",chart[ans[i]]); //按编码输出对应的字符
}
printf("\n");
}
return 0;
}