0
点赞
收藏
分享

微信扫一扫

对标世界一流|从Just in time到Just in case ——汽车行业供应链管理经验借鉴

胡桑_b06e 2023-05-06 阅读 49

《编程思维与实践》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;
}
举报

相关推荐

0 条评论