当前位置:首页 » 编程语言 » base64解码c语言

base64解码c语言

发布时间: 2023-09-23 19:55:30

1. c语言编程:编写一个函数base64加密

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

constchar*chlist="+/";

intencode_string(char*str,unsignedintlength,char*stat){
chars[103];
inti,j;
unsignedtemp;
if(length<=0)return1;
if(length>100)return2;
str[length]='';
strcpy(s,str);
while(strlen(s)%3)strcat(s,"=");
for(i=0,j=0;s[i];i+=3,j+=4){
temp=s[i];
temp=(temp<<8)+s[i+1];
temp=(temp<<8)+s[i+2];
stat[j+3]=chlist[temp&0X3F];
temp>>=6;
stat[j+2]=chlist[temp&0X3F];
temp>>=6;
stat[j+1]=chlist[temp&0X3F];
temp>>=6;
stat[j+0]=chlist[temp枣郑&0X3F];
}
stat[j]='';
return0;
}

intIndex(charch){
inti;
for(i=0;chlist[i];++i){
if(chlist[i]==ch)
returni;
}
return档岩漏-1;
}

voiddecode_string(char*s,char*t){
unsignedtemp;
inti,j,k,len=strlen(s);
if(len%4){
printf("无效数据。 ");
exit(2);
}
for(i=0,j=0;i<=len;i+=4,j+=3){
temp=0;
for(k=0;k<4;++k)
temp=(temp<<6)+Index(s[i+k]);
for(k=2;k>=0;--k){
t[j+k]=temp&0XFF;
temp>>=8;
}
}
t[j+k]='';
}

intmain(){
chars[100]="1a2a3s4dff5fj6u7M8B9P0O1U2";
chart[150],u[100];
printf("s行烂=%s ",s);
encode_string(s,strlen(s),t);
printf("t=%s ",t);
decode_string(t,u);
printf("u=%s ",u);
return0;
}

2. 用c语言实现python的md5功能

题中所示代码中,python实现了计算空字符串的MD5值,并对MD5的值的十六进制的字符串所表示的字节进行BASE64处理。

不像Python内部有实现md5功能,根据ANSI C标准,C语言的标准库里是没有md5功能的;

但是RFC1231规定了MD5功能的C实现并提供了附件,可以直接用,也可以直接获取现成的实现,在编译链接时指定正确的.h头文件和.lib静态链接库文件;

这里我采取前者的做法(电脑上没有装VC,有VC就简单很多,使用的是minGW)大概六七百行代码左右。

然后这里展示不完,给个实现效果图

BASE64的编码原理

3. C语言对文件字符串进行解码

#include<stdio.h>
main(){
FILE*fp1,*fp2;
chara[100];
charsecret[]="Kirschsaft!";
inti,j;
fp1=fopen("source.txt","r");
fp2=fopen("result.txt","w");
if(fp1==NULL||fp2==NULL)
return;
while(fgets(a,100,fp1)!=NULL){
for(i=0,j=0;a[i]!=' ';i++,j++){
if(j==11)
j=0;
if((int)a[i]>=32){
a[i]=a[i]^secret[j];
if((int)a[i]<32){
a[i]=a[i]+32;
}
}
}
for(;j>0&&j<11;j++,i++){
a[i]=secret[j];
}
a[i++]=' ';
a[i]='';
fprintf(fp2,"%s",a);
}
}

应该是限制高3位,使得每个字符的ASCII码大于0010 0000,即32。

我的策略是如果做完异或之后的ASCII码小于32就给他加32.

4. C语言的Base64解码

加一个break跳出循环即可。

#include<stdio.h>
#include<string.h>
intmain(void)
{
chary[4000]/*原文本*/,b[3999*4/3]/*待解的Base64码*/,mb[64]/*Base64码表*/;
inti,j/*i,j为两个计数用的变量*/,zu/*将待解的Base64码分成4个字符一组,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);/*输入Base64码*/
for(i=0;i<strlen(b)-1;++i)/*处理b中的每个字符*/
for(j=0;j<64;++j)
if(mb[j]==b[i])
{
b[i]=j; /*寻找各字符对应的码表序枯备埋号,貌似就是这里出的问题*/
break;/*一找到就滚前跳出,可避免重复没蚂比较。没有这句会重复比较到最后,如果j的值刚好落在字符数字的ASCII码中,会引起的重复的给b[i]赋值*/
}
for(zu=0;zu<(strlen(b)-1)/4;++zu)/*Base64解码*/
{
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 ",y);/*输出原文本*/
return0;
}
热点内容
Java运行脚本优化 发布:2025-03-07 06:29:38 浏览:976
wrt编译软路由添加驱动 发布:2025-03-07 06:28:38 浏览:969
Ajaxphpjquery分页 发布:2025-03-07 06:24:25 浏览:833
抖音我的缓存我关了有影响吗 发布:2025-03-07 06:19:52 浏览:66
c语言多行数据 发布:2025-03-07 06:17:50 浏览:346
52好压压缩 发布:2025-03-07 06:04:47 浏览:68
相邻算法 发布:2025-03-07 06:01:51 浏览:581
编译器中 发布:2025-03-07 06:01:44 浏览:482
电视现在什么配置好 发布:2025-03-07 06:01:06 浏览:626
安卓内存很大为什么还是卡 发布:2025-03-07 05:43:53 浏览:535