最近要完成了一个关于解压缩的工作,而拿到的源代码是基于文件形式。不符合项目的开发需要,所以就只有在原来的基础上加以修改了。刚开始觉得很麻烦,后来随着代码一步步的修改和查看,刚开始总想着要弄明白算法的流程与思想,后来发现时间真的不够用,到最后的修改调试完善也只用了2天,只是弄清楚了流程与一些接口的说明,发现到最后,只要在源和尾的地方修改以后(也就是读入文件和输出文件的那部分),就可以了,毕竟写这个算法的牛人,把代码的功能封装已经很完善了。
在解压时,主要是通过
#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(0));
#define try_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(1));
这两个宏定义来进行,对压缩包文件的分析和工作,从上面可以看出,当inbuf[]的数据都读完时,马上把inbuf里的数据更新一下,那么我们把inbuf想象的非常大,那么就不用从新的更新了,那么所有的数据都在内存里的那么我把这个宏梢微的修改了一下
#define get_byte() (inptr<insize ? inbuf[inptr++]: do_exit(1))
do_exit()做的是释放内存的工作。
那么相应的输出也是很简单的,原始的输出是到文件,那么我们只要分配一个内存空间,把原来的输出到文件的部分memcpy(des,src,length)到新的,也就相应的实现了。
在宏定义中已经知道的很清楚了,定义如下
#define put_ubyte(c) {window[outcnt++]=(uch)(c); if (outcnt==WSIZE)/
flush_window();}
那么修改flush_window();就实现了在内存中的输出
而在压缩时
修改原理基本上也和解压时差不多
只是修改的地方不一样了
主要是修改file_read(buf, size)这个方法,输出也和上面的类,查看宏定义
#define put_byte(c) {outbuf[outcnt++]=(uch)(c); if (outcnt==OUTBUFSIZ)/
flush_outbuf();}
修改flush_outbuf();
以上源代码(原始版本)在www.zip.org 中可以获取
如果大家有更好的方案可以在留言中回复.或alajl@hotmail.com