现在的位置: 首页 > 综合 > 正文

ASCII压缩算法实现

2013年04月23日 ⁄ 综合 ⁄ 共 1538字 ⁄ 字号 评论关闭

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

//压缩函数,采用开解循环提高效率
void ASCII_Compress(char *dest,char *src)
{
     dest[0]=src[0];
     dest[1]=src[1];
     dest[2]=src[2];
     dest[3]=src[3];
     dest[4]=src[4];
     dest[5]=src[5];
     dest[6]=src[6];
     dest[0]|=((src[7]&0x40)<<1);
     dest[1]|=((src[7]&0x20)<<2);
     dest[2]|=((src[7]&0x10)<<3);
     dest[3]|=((src[7]&0x8)<<4);
     dest[4]|=((src[7]&0x4)<<5);
     dest[5]|=((src[7]&0x2)<<6);
     dest[6]|=((src[7]&0x1)<<7);
}
size_t ASCII_ReadStream(char* buf,FILE *stream)
{
    size_t nCount=0;
    nCount=fread(buf,1,8,stream);       
    return nCount;
}
char*ASCII_CompressName(char*OldName)
{
 char*newName=(char*)malloc(strlen(OldName)+5);
 strcpy(newName,OldName);
 strcat(newName,".ASC");//拓展名ASC short for ASCII_Compress
 return newName;
}
void ASCII_CompressWrite(FILE *ReadStream,FILE *WriteStream)
{
     size_t nCount=0;
     char buf[7],src[8];
     while(nCount=ASCII_ReadStream(src,ReadStream))
       {
        if(8==nCount)
         {
          ASCII_Compress(buf,src);
          fwrite(buf,1,7,WriteStream);
         }
        else
          fwrite(src,1,(int)nCount,WriteStream);
       }
}

int main(int argc,char* argv[])
{
    FILE *FileRead,*FileWrite;

    if(FileRead=fopen(argv[1],"r+"))
      {
         char*newName=ASCII_CompressName(argv[1]);
         FileWrite=fopen(newName,"a+");

         free(newName);
         if(!FileWrite)
            goto Main_OpenFile_Worry;  
         ASCII_CompressWrite(FileRead,FileWrite);
      
         fclose(FileWrite);
Main_OpenFile_Worry:
         fclose(FileRead);
      }
    else
       printf("Open worry/n");
    return 0;
}

抱歉!评论已关闭.