CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

有关huffman加密的密码的一切破译算法

楼主stavck(在河之洲)2001-06-12 16:06:00 在 专题开发/技术/项目 / 数据结构与算法 提问

j具体问提为,先打开一个文件,进行统计求出各个字符占的比重,用此对一篇文章进行加密,然后在解密。请问如何做? 问题点数:23、回复次数:1Top

1 楼ychener(贫血)回复于 2001-06-12 22:44:00 得分 23

给你一个源程序(BC31   很早以前写的),需要编译好的EMail我:ychener@sina.com  
  #include   <stdio.h>  
  #include   <string.h>  
  #include   <stdlib.h>  
  #include   <alloc.h>  
   
  #define   OK   1  
  #define   ERROR   0  
  #define   TRUE   -1  
  #define   FALSE   0  
  #define   OVERFLOW   -2  
  typedef   struct   WeightList     {  
        char   asc;  
        long   int   wei;  
  };  
  typedef   struct     {  
        long   int   weight;  
        char   asc;  
        unsigned   int   parent,lchild,rchild;  
  }HTNode,*HuffmanTree;  
   
  typedef   struct   FileStruct     {  
        char   fn[12];  
        int   number;  
        long   int   filelength;  
  };  
   
  WeightList   WeiL[255];  
  FileStruct   Head;  
  char   HC[255][50];  
  long   int   Weight[255];  
  int   Number;  
   
  void   Init(void);  
  void   ReadFile(char   *);  
  void   ConvertWeight(void);  
  void   HuffmanCoding(HuffmanTree   &HT);  
  void   Select(HuffmanTree   &HT,int   n,int   &s1,int   &s2);  
  void   PackFile(char   *fn);  
  void   UnpackFile(char   *fn);  
   
  void   Init(void)     {  
        int   i;  
        for   (i=0;i<255;i++)     {  
              Weight[i]=0;  
              WeiL[i].asc=WeiL[i].wei=0;  
        }  
        Number=0;  
  }  
   
  void   ReadFile(char   *fn)     {  
          FILE   *fp;  
          long   int   len=0;  
          char   ch;  
          strcpy(Head.fn,fn);  
          if   ((fp=fopen(fn,"rb"))==NULL)     {  
  printf("File   Not   Found!");  
  exit(-1);  
          }  
          while(!feof(fp))     {  
                ch=fgetc(fp);  
                Weight[(int)ch]++;  
                len++;  
          }  
          Head.filelength=len;  
          fclose(fp);  
  }  
   
  void   ConvertWeight(void)     {  
          int   i;  
          for   (i=0;i<255;i++)  
  if   (Weight[i]!=0)     {  
          WeiL[Number].asc=i;  
          WeiL[Number].wei=Weight[i];  
          Weight[i]=Number;  
          Number++;  
  }  
          Head.number=Number;  
  }  
   
  void   Select(HuffmanTree   &HT,int   n,int   &s1,int   &s2)     {  
          int   i;  
          long   int   wei=60000;  
          for   (i=0;i<n;i++)  
  if   ((HT+i)->parent==0)  
        if   ((HT+i)->weight<wei)     {  
  s1=i;  
  wei=(HT+i)->weight;  
        }  
          wei=60000;(HT+s1)->parent=1;  
          for   (i=0;i<n;i++)  
  if   ((HT+i)->parent==0)  
        if   ((HT+i)->weight<wei)     {  
                s2=i;  
                wei=(HT+i)->weight;  
        }  
          (HT+s1)->parent=(HT+s2)->parent=0;  
  }  
   
  void   HuffmanCoding(HuffmanTree   &HT)     {  
          int   m,i,pw,start,c,f,s1,s2;  
          char   cd[255];  
          HTNode   *p;  
          m=Number*2-1;pw=0;  
          HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));  
          for   (p=HT,i=1;i<=Number;++i,++p,++pw)     {  
  p->weight=WeiL[pw].wei;  
  p->asc=WeiL[pw].asc;  
  p->parent=p->lchild=p->rchild=0;  
          }  
          for   (;i<=m;++i,++p)     p->weight=p->parent=p->lchild=p->rchild=0;  
          for   (i=Number+1;i<=m;++i)     {  
  Select(HT,i-1,s1,s2);  
  (HT+s1)->parent=(HT+s2)->parent=i-1;  
  (HT+i-1)->lchild=s1;(HT+i-1)->rchild=s2;  
  (HT+i-1)->weight=(HT+s1)->weight+(HT+s2)->weight;  
          }  
          cd[Number-1]='\0';  
          for   (i=0;i<Number;++i)       {  
  start=Number-1;  
  for   (c=i,f=(HT+i)->parent;f!=0;c=f,f=(HT+f)->parent)  
          if   ((HT+f)->lchild==c)   cd[--start]='0';  
          else   cd[--start]='1';  
  strcpy(HC[i],&cd[start]);  
          }  
  }  
   
  void   PackFile(char   *fn)     {  
          FILE   *fpin,*fpout;  
          long   int   pp=0;  
          unsigned   int   i,num,length,count;  
          char   ch,*buffer;  
          fpout=fopen(fn,"wb");  
          fpin=fopen(Head.fn,"rb");  
          buffer=(char   *)malloc(255);  
          fwrite(&Head,sizeof(Head),1,fpout);  
          for   (i=0;i<Number;i++)  
                fwrite((WeiL+i),sizeof(WeightList),1,fpout);  
          num=length=count=0;  
          while(!feof(fpin))       {  
  ch=fgetc(fpin);  
  length=strlen(HC[Weight[ch]]);  
  strcpy(buffer,HC[Weight[ch]]);  
  for   (i=0;i<length;i++)     {  
          num*=2;  
          if   (buffer[i]=='1')   num++;  
          count++;  
          if   (count>=15)     {  
  fwrite(&num,sizeof(num),1,fpout);  
  if   (pp++%1000==0)   printf(".");  
  count=num=0;  
          }  
  }  
          }  
          while(count<=15)     {     num*=2;count++;       }  
          fwrite(&num,sizeof(num),1,fpout);  
          free(buffer);  
          fclose(fpin);  
          fclose(fpout);  
  }  
   
  void   UnpackFile(char   *fn)       {  
          FILE   *fin,*fout;  
          long   int   pp=0;  
          struct   FileStruct   head;  
          int   i,j,p,seek;  
          unsigned   int   num;  
          long   int   flen,count;  
          char   bin[17];  
          HuffmanTree   ht;  
          if   ((fin=fopen(fn,"rb"))==NULL)     {  
    printf("File   Not   Found!");  
    exit(-1);  
          }  
          fread(&Head,sizeof(Head),1,fin);  
          fout=fopen(Head.fn,"wb");  
          Number=Head.number;  
          for   (i=0;i<Number;i++)  
  fread((WeiL+i),sizeof(WeightList),1,fin);  
          HuffmanCoding(ht);  
          flen=Head.filelength;  
          seek=sizeof(Head)+Number*sizeof(WeightList);  
          fseek(fin,seek,0);  
          i=count=0;  
          p=2*Number-2;  
          while(count<flen)     {  
  i=0;  
  fread(&num,sizeof(num),1,fin);  
  for   (j=14;j>=0;j--)     {  
        if   (num%2==1)   bin[j]='1';  
        else   bin[j]='0';  
        num/=2;  
  }  
  bin[15]=0;  
  while   (1)     {  
        if   (bin[i]=='0')  
                p=(ht+p)->lchild;  
        else   if   (bin[i]=='1')  
                p=(ht+p)->rchild;  
        i++;  
        if   (i>15)   break;  
        if   (((ht+p)->lchild==0)&&((ht+p)->rchild==0))     {  
                if   (count>=flen-1)   {  
      count++;break;  
                }  
                fwrite(&(ht+p)->asc,1,1,fout);  
                if   (pp++%1000==0)   printf(".");  
                count++;  
                p=2*Number-2;  
        }  
  }  
          }  
          fclose(fin);  
          fclose(fout);  
          free(ht);  
          return   ;  
  }  
   
  void   main(int   argc,char   *argv[])     {  
        HuffmanTree   HT;  
        if   (argc==1)     {  
              printf("This   is   The   HuffmanCoding   Zip   Program.\n");  
              printf("                                               -----C.Chen   1999\n");  
              printf("Use:     PACK:HUFF   -h   [source   filename]   [object   filename].\n");  
              printf("         UNPACK:HUFF   -u   [source   filename].   \n");  
        }  
        else   if   (argc==4)     {  
              if   (strcmp(argv[1],"-h")==0)     {  
          ReadFile(argv[2]);  
          ConvertWeight();  
          HuffmanCoding(HT);  
          PackFile(argv[3]);  
              }  
              else       printf("Use   ERROR!");  
        }  
        else   if   (argc==3)     {  
              if   (strcmp(argv[1],"-u")==0)     UnpackFile(argv[2]);  
        }  
        else  
              printf("Use   ERROR!");  
  }  
  Top

相关问题

  • 加密算法!
  • 求加密算法。
  • ~~~~~~~MD5加密算法~~~~~~
  • 求加密算法
  • md5加密算法
  • 字符串加密算法
  • 关于DES加密算法
  • 加密算法大比拼
  • 求rijndael加密算法
  • 加密算法分析

关键词

  • ht
  • huffmantree
  • lchild
  • weight
  • rchild
  • huffmancoding
  • packfile
  • fpout
  • parent
  • htnode

得分解答快速导航

  • 帖主:stavck
  • ychener

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo