當前位置:首頁 » 編程語言 » 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;
}
熱點內容
androidgetpath 發布:2025-03-07 03:07:30 瀏覽:474
aspphp環境 發布:2025-03-07 02:40:38 瀏覽:382
c語言漢字轉拼音 發布:2025-03-07 02:26:05 瀏覽:557
磁碟與資料庫 發布:2025-03-07 02:19:54 瀏覽:561
微信的緩存是什麼 發布:2025-03-07 02:15:17 瀏覽:995
sql添加表數據 發布:2025-03-07 02:15:16 瀏覽:593
其他台式電腦怎麼登錄伺服器 發布:2025-03-07 02:09:45 瀏覽:106
數控車床g76編程實例 發布:2025-03-07 02:07:43 瀏覽:662
魔獸世界新伺服器是什麼意思 發布:2025-03-07 02:07:41 瀏覽:619
ftp傳輸二進制 發布:2025-03-07 01:57:26 瀏覽:286