永发信息网

C语言的Base64解码

答案:1  悬赏:10  手机版
解决时间 2021-02-05 09:16
用下面的代码解Base64加密字符老会出错,后来发现处理一个字符时15、16行有时会对b[i]多次赋值,这是怎么回事?(暂时不考虑加密字符中出现等于号的情况)

#include <stdio.h>
#include <string.h>
int main(void)
{
char y[4000],b[3999*4/3],mb[64];
int i,j,zu;
for (i=0;i<26;++i) mb[i]=i+65;
for (i=0;i<26;++i) mb[i+26]=i+97;
for (i=0;i<10;++i) mb[i+52]=i+48;
mb[62]='+';
mb[63]='/';
for(i=0;i<4000;++i) y[i]=0;
for (i=0;i<3999*4/3;b[i++]=0);
fgets(b,3999*4/3-1,stdin);
for (i=0;i<strlen(b)-1;++i)
for (j=0;j<64;++j) if (mb[j]==b[i]) b[i]=j;
for (zu=0;zu<(strlen(b)-1)/4;++zu)
{
y[zu*3+0]=((b[zu*4+0]<<2))|(b[zu*4+1]>>4);
y[zu*3+1]=((b[zu*4+1]<<4))|(b[zu*4+2]>>2);
y[zu*3+2]=((b[zu*4+2]<<6))|b[zu*4+3];
}
printf("%s\n",y);
return 0;
}
最佳答案
加一个break跳出循环即可。
#include <stdio.h>
#include <string.h>
int main(void)
{
char y[4000],b[3999*4/3],mb[64];
int i,j,zu;
for (i=0;i<26;++i) mb[i]=i+65;
for (i=0;i<26;++i) mb[i+26]=i+97;
for (i=0;i<10;++i) mb[i+52]=i+48;
mb[62]='+';
mb[63]='/';
for(i=0;i<4000;++i) y[i]=0;
for (i=0;i<3999*4/3;b[i++]=0);
fgets(b,3999*4/3-1,stdin);
for (i=0;i<strlen(b)-1;++i)
for (j=0;j<64;++j) 
if (mb[j]==b[i]) 
{
b[i]=j;
break;  
}
for (zu=0;zu<(strlen(b)-1)/4;++zu)
{
y[zu*3+0]=((b[zu*4+0]<<2))|(b[zu*4+1]>>4);
y[zu*3+1]=((b[zu*4+1]<<4))|(b[zu*4+2]>>2);
y[zu*3+2]=((b[zu*4+2]<<6))|b[zu*4+3];
}
printf("%s\n",y);
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
!~~匡威鞋37.5与38号错多少?38号的放个鞋垫
房东不许转让还要收回房子,合同上注明是允许
某投资者购买了一总价为300万元的店铺用于经
last time,for the last time,the last time
武城第一家猪肉串老城店地址有知道的么?有点
我想买Jeep品牌服装,不知哪家商店有卖?
为什么有人怕痒
黄金身段地址在什么地方,我要处理点事
寿阳县城管局地址在什么地方,想过去办事
享鼎的意思是什么啊?知道的请说下!
我国是一个以燃煤为主的国家,在能源消费构成
97#汽油93#混加后,能不能再加入燃油宝汽油添
宜欣牌的6-15免烧砖机质量怎么样?
闺蜜劝我和男友分手,但她又喜欢在我不在的时
麦乐滋(仪陇人民路店)在哪里啊,我有事要去这
推荐资讯
汗蒸美容养生会所地址有知道的么?有点事想过
吉祥电脑在哪里啊,我有事要去这个地方
国瑞汽配地址在哪,我要去那里办事
就丙购买房屋的合同而言,关于合同主体、房屋
【俄罗斯红场】俄罗斯红场英文简介5—7句就行
北京清河在哪个区
腰恒沟怎么去啊,有知道地址的么
木讷的意思是什么啊?知道的请说下!
魂斗罗归来怎么快速升级 大神传授新秘籍
win7安装jdk-7u3-windows-i586为什么老是提示
老板在公司拿衣服送人应该怎样做会计分录
新势力培训中心(衡阳珠晖区)地址在什么地方,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?