| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 627 人关注过本帖
标题:简单的解压源码,求压缩
只看楼主 加入收藏
kof888
Rank: 1
等 级:新手上路
帖 子:26
专家分:1
注 册:2009-4-1
结帖率:60%
收藏
已结贴  问题点数:30 回复次数:2 
简单的解压源码,求压缩
完蛋了,会写解压不会写压缩,求大大指教

程序代码:
#include <stdio.h>
#include <stdlib.h>
unsigned char buf[0x2000000];
main()
{    FILE *fa,*fb;
    if((fa=fopen("0.dat","rb"))==NULL){ exit(0);}


    if((fb=fopen("0.bin","wb+"))==NULL){exit(0);}

   
    for(;;)
    {
        ah = fgetc(fa);
       
        if (ah==0xc0)break;
       
        else if (ah<0xc1 ){buf[r++] = ah; fputc(ah,fb);}
       
        else if (ah==0xc1){bh=fgetc(fa);fputc(bh,fb);buf[r++] = bh;}
       
        else if (ah>0xc1)
        {
           
            bh = fgetc(fa);   
            c  = r-bh;
           
            for (k = 0; k <ah-0xc0; k++)
            {
                bh = buf[c + k];
                putc(bh, fb); 
                buf[r++] = bh;
            }
        }
    }
    fcloseall();
}

搜索更多相关主题的帖子: 压缩 源码 
2010-06-25 22:15
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:30 
update。
2010-06-27 16:14
kof888
Rank: 1
等 级:新手上路
帖 子:26
专家分:1
注 册:2009-4-1
收藏
得分:0 
自己写了个,不过速度和压缩比都没原版的好,感觉上还可以优化,不过水平有限,希望能得到高人的指点
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
unsigned char buf[0x2000000];

main()
{
       FILE *fa,*fb,*fc;

    unsigned int r=0,k=0,c=0,x=0,y=0,size,b,t=0,n,tt=0;
    unsigned char ah,bh,ch,xh,yh,zh,aa,zz;

    if((fa=fopen("BOSS.dat","rb"))==NULL){exit(0);}
    if((fb=fopen("temp.bin","wb+"))==NULL){exit(0);}
    if((fc=fopen("0.bin","wb+"))==NULL){exit(0);}
   

    fseek(fa,0,2);
    size=ftell(fa);
    fseek(fa,0,0);

    ah = fgetc(fa);fputc(ah,fc);fputc(ah,fb);    x++;
    ah = fgetc(fa);fputc(ah,fc);fputc(ah,fb);    x++;
    ah = fgetc(fa);fputc(ah,fc);fputc(ah,fb);    x++;
   
    for(n=0;n<size;)
    {
        ah = fgetc(fa);
        bh = fgetc(fa);
        ch = fgetc(fa);n+=3;tt=3;if(n>=size)break;
       
       
        printf("%x \n", n);

        if(x>0xff){c=0xff;}//回退量最大退ff字节
       
        else{c=x;}
       
        r=0;
       
        fseek(fb,-c,1);
       
        for(y=0;y<c;)
        {
            fseek(fb,-r,1);
           
            c=c+r;
           
            xh = fgetc(fb);
           
            c--;if(c==0)break;
           
            r=0;
           
            if(ah==xh)
            {
                yh = fgetc(fb);r=1; c--;if(c==0)break;
               
                if(bh==yh)
                {
                    zh = fgetc(fb);r=2;    c--;
                   
                    if(ch==zh)
                    {
                        b=c+3;r=3;t=0;tt=0;
                       
                        if(c!=0)
                        {
                            for(;;)
                            {
                                aa = fgetc(fa);
                                zz = fgetc(fb);
                                n++;if(n==size)break;//读完数据跳出
                           
                            if(aa!=zz)break;//不相同跳出
                           
                            r++;buf[t++] = aa;    c--;if(c==0)break;//回退量最==0退出
                           
                            if(r==0x3f)break;//大于复制的字节数跳出
                            }
                        }
                       
                        fseek(fb,0,2);fputc(ah,fb);fputc(bh,fb);fputc(ch,fb);x+=3;
                       
                       
                        for(y=0;y<t;y++){ah = buf[y];fputc(ah,fb);x++;}

                        r=r+0xc0;
                        fwrite(&r,sizeof(char),1,fc);
                        fwrite(&b,sizeof(char),1,fc);
                        fseek(fa,-1,1);    n--;
                        if((r==0xff)||(c==0)){fseek(fa,1,1);n++;if(n==size)break;}    

                        goto loop;
                    }
                }
            }
        }
       
        if(n==size)break;
       
        if(r<3)
        {
            if(ah<0xc0){fputc(ah,fc);}

            else{fputc(0xc1,fc);fputc(ah,fc);}
           
            fseek(fb,0,2);fputc(ah,fb);

            fseek(fa,-2,1);    x++;n-=2;
        }

loop:;}

 
    fputc(0xc0,fc);   
    fcloseall();
    remove("temp.bin");
    return 1;
   
}

    













2010-06-29 00:50
快速回复:简单的解压源码,求压缩
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019217 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved