首页 > 编程资源分享区 > C/C++源代码共享 > 用C实现uuencode编码和解码[转贴]
2006
05-30

用C实现uuencode编码和解码[转贴]





    最近在玩的那个网页过关游戏,确实学到了不少东西,以前自己不了解的,不知道的,现在也都有了初步的了解,象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();
}


留下一个回复