H10【选做•同学出题】动手实现Base64算法

题目描述

解题思路

将字符串转化为二进制数字,再将其6个分为一组,不足补零再根据Base64编码表转化为对应字符

将单个字符转化为二进制数字:

x=(a_{7}a_{6}a_{5}a_{4}a_{3}a_{2}a_{1}a_{0})_{2}=\sum_{i=0}^{7}2^{i}a_{i}  其中x为字符对应ASCII码

则我们可以得到a_{i}\equiv{\left [ \frac{x}{2^{i}} \right ]}\pmod{2}

char letter;
int binaryNum[8]={0,};
for(int i=0;i<8;i++){
    binaryNum[i]=letter/pow(2,i)%2;
}

这样我们就能得到字符对应二进制数字,对字符串中所有字符进行该操作就能得到字符串对应二进制数字,再6个字节一组,共分为4\left \lceil \frac{n}{3} \right \rceil组(其中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;  
} 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值