题目描述
解题思路
将字符串转化为二进制数字,再将其6个分为一组,不足补零再根据Base64编码表转化为对应字符
将单个字符转化为二进制数字:
其中x为字符对应ASCII码
则我们可以得到
char letter;
int binaryNum[8]={0,};
for(int i=0;i<8;i++){
binaryNum[i]=letter/pow(2,i)%2;
}
这样我们就能得到字符对应二进制数字,对字符串中所有字符进行该操作就能得到字符串对应二进制数字,再6个字节一组,共分为组(其中n表示原字符串的长度)
将每组对应二进制转化为十进制,再根据Base64编码表找到对应字符,存入新的字符串即可
代码实现
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(){
int nums[560]={0,}; //存储字符串对应二进制数
char base64[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','+','/'},str[71]={0,};
char newstr[120]={0,}; //存储base64加密后的字符串
scanf("%s",str);
for(int i=0;i<strlen(str);i++){ //将字符串转化为对应二进制数
for(int j=0;j<8;j++){
nums[8*i+j]=(int)(str[i]/pow(2,7-j))%2;
}
}
for(int i=0;i<(strlen(str)/3+((strlen(str))%3!=0))*4;i++){ //将二进制数根据编码表转化为对应编码字符串
int count=0; //每组对应十进制数值
for(int j=0;j<6;j++){
count+=nums[6*i+j]*(int)pow(2,5-j);
}
newstr[i]=base64[count];
}
//下面是将末尾补的无意义的0转化为'=',如果看不懂,可以直接对strlen(str)进行模3讨论
//若模3余0,则不用修改;若模3余1,则将末尾两个字符修改为'=';若模3余2,则将末尾一个字符修改为'='
for(int j=(strlen(str)/3+((strlen(str))%3!=0))*4-(3-(strlen(str))%3)%3;j<(strlen(str)/3+((strlen(str))%3!=0))*4;j++){
newstr[j]='=';
}
printf("%s\n",newstr);
return 0;
}