最近在玩的那个网页过关游戏,确实学到了不少东西,以前自己不了解的,不知道的,现在也都有了初步的了解,象uuencode编码、base64编码、MD5和凯撒密码。其实我觉得象这种游戏,确实很能激发人的学习欲望,这之中认识了chocobo,唯C论坛的朋友,怎么说呢?反正就是知识面挺广,学的也非常不错的。以下就是我在这期间学到的uuencode编码,现在用c实现了,程序如下:
#include<stdio.h> /*对文本进行uuencode编码*/ void uuencode(char *txt,FILE *target_fp) /*编码*/ { int i,n,j=0,flag=0; static int bit_value[]={32,16,8,4,2,1}; char code[25],uue[4]={0},end[3]={0}; if(target_fp==NULL)return; code[24]=’\0′; n=strlen(txt);i=n%3; if(i) /*所读字节数不是三的倍数要补齐*/ { if(i==1) {end[0]=txt[n-1];end[1]=end[2]=48;} else {end[0]=txt[n-2];end[1]=txt[n-1];end[2]=48;} flag=1; } fprintf(target_fp,”%c”,n+32);/*写每一行开头字符*/ while(*txt) { n=(int)(*txt); for(i=0;i<8;i++) if(n&(128>>i))code[j*8+i]=49; else code[j*8+i]=48; ++j; /*控制每次对三个文本进行编码*/ if(j==3) { code[0]++;code[6]++;code[12]++;code[18]++; for(n=0;n<4;n++) /*24位按6位分成4个字符*/ for(i=0;i<6;i++) uue[n]+=((int)code[n*6+i]-48)*bit_value; fprintf(target_fp,”%c%c%c%c”,uue[0],uue[1],uue[2],uue[3]); j=0; for(i=0;i<4;i++)uue=0; } txt++; if(!(*txt)&&flag){txt=end;flag=0;} } }
/*对以uuencdoe编码的字符进行解码*/ void deuuencode(char uue[],FILE *target_fp) { char code[33],deuue[3]={0}; int i,j=0,n; static int bit_value[]={128,64,32,16,8,4,2,1}; if(target_fp==NULL)return; code[32]=’\0′; while(*uue) { n=(int)(*uue); for(i=0;i<8;i++) if(n&(128>>i))code[j*8+i]=49; else code[j*8+i]=48; ++j;n=(j-1)*8+1; if(code[n+1]==49)code[n+1]=48; if(code[n]==49) { code[n]=48; code[n+1]=49; } ++uue; if(j<4)continue; for(n=0,i=2;n<4;n++,i+=8) /*移位,去掉每个字节的最高两位*/ for(j=0;j<6;j++) code[i+j-2*(n+1)]=code[i+j]; code[24]=’\0′; for(n=0;n<3;n++) /*解码后的字符存入deuue中*/ for(i=0;i<8;i++) deuue[n]+=((int)code[n*8+i]-48)*bit_value; } fprintf(target_fp,”%c%c%c”,deuue[0],deuue[1],deuue[2]); }
/*对成批字符串进行解码*/ int String_Deuuencode(char *str,FILE *fp) { int i,n; char uue[5]; n=strlen(str); if(n%4!=0)return 0; /*不是4的倍数时*/ n/=4; uue[4]=’\0′; for(i=0;i<n;i++) { strncpy(uue,str,4); deuuencode(uue,fp); str+=4; } return 1; }
void main() { FILE *fp; char *str=”4$-&150P3E575D)&245H5515=V=51E9#5$5L1$E#271,&g t;3E833!-=DPP4E52″; if((fp=fopen(“aa.txt”,”wb”))==NULL)exit(0); if(!String_Deuuencode(str,fp))printf(“error”); else printf(“ok”);/* uuencode(str,fp); */ getch(); } |