当前位置: 代码迷 >> C语言 >> [**** 加入了压缩分卷!和扇区到扇区读写****] [原创]DOS下迷你硬盘读写器终 ...
  详细解决方案

[**** 加入了压缩分卷!和扇区到扇区读写****] [原创]DOS下迷你硬盘读写器终 ...

热度:226   发布时间:2006-07-20 17:53:42.0
发现这个程序在获取老硬盘参数时的BUG,这个BUG导致读写老硬盘失败
已更正。

原BUG如下:
cylinder=regs.h.ch+1; /* 寄存器的 CH +1 为柱面数 应该是CL的高2位为高2位,CH的8位为低8位 */
sector=regs.h.cl; /* 寄存器的 CL 为每道扇区数 应该是 CL 的低6位 */

改为:
cylinder=((((unsigned int)regs.h.cl)>>6<<8) | regs.h.ch) + 1;
sector=regs.h.cl & 0x3F;

在取值时,没有用指针甚至一般运算,用高效而好玩的位运算。。

现在读写老硬盘就可以了。。
如果有老硬盘的,可以试玩试玩,我自己还没有呢。。


[此贴子已经被作者于2006-7-20 20:46:03编辑过]


----------------解决方案--------------------------------------------------------

刚成功地解决了 压缩引擎问题,下一步就是嵌入到我的程序中实现压缩功能了!
这几天,在国外的网上遨游,下了不下几十套源码!在几百个文件中穿梭!
终于找到了我要的!解决了我的问题
就是 zlib !

简要的过程如下:
1
试了,简单古老的

LZ, LZW,HUFFMAN,LZHUF,LZSS,LZHARC, LZ77,LZARI,LZRW1等等,都不理想,太老,效率太低,只能用来教学。。
2
看了 ARJ/UNARJ,有很多我不要的功能。。
3
曾定在 GZIP(BZIP2,基本差不多),很不错,也觉得有点适合我,压缩比和速度都很好,还有1-9的压缩比选项。。钻研了几天,发现没有内存压缩,只有文件压缩,。。。
4
看到一个提示: zlib 支持内存压缩!
确定它了!
(ZLIB和GZIP,PNG都采用相同的引擎:基于LZ77和HUFFMAN的结合,当然和前面提到的古老原始的版本是不可同日而语的)


在此过程中,与DDCOPY作者李治联系了。取得了DDCOPY源么,对我有启发。。
不过,试了DDCOPY的压缩,不太理想,豪时长,压缩比低。因为他采用的压缩/解压的类较简单,就两个文件(用简单的LZSS,胡颖卓编写的类,后来我也在网上看到了)

将要采用的压缩引擎是先进的最新版的 zlib-1.2.3 库(与GZIP,PNG图象用的同一个引擎),
压缩比和压缩速度很快,解压速度更快的离谱!
在WIN32 控制台程序中,压缩50MB,大约要20秒,压为了25MB。
解压只要大约3秒! 我靠!
还有 压缩比的1-9选项(类似GHOST)。。。



----------------解决方案--------------------------------------------------------
感谢LZ的辛勤劳动,努力学习中!
----------------解决方案--------------------------------------------------------

完全解决拉!
已经成功放入程序中,被调用,运行结果正确!

并且,令人激动的是:所采用的 ZLIB库的表现相当棒!
刚才,测试结果:

压缩备份:
压缩1000000个扇区(500MB),采用6级(最高9级)就能压为312MB !
(如用9级,大约能压到 250-280之间!)
而且用时仅12分钟!大约一秒钟1MB!(跟GHOST速度差不多!)
而且是读一个很老的2GB的硬盘!

(注意:由于GHOST不处理没有文件的的数据,所以,在备份分区时,所化的总时间自然就很少了。毕竟他不是整个扇区的全真备份。我的程序是的)

解压还原:
解压就快的离谱拉!
把压缩的景象文件(原500MB)解压后还原到硬盘上,大约1分钟左右!
简直不敢相信!这个ZLIB 的解压作者是 Mark Adler,真是牛!
他好象也美国火星计划的研究人员。。


现正在整理程序。进入最后阶段。。。

大概两三天能出来。。。

(DDCOPY 作者李治帮过我,由于我的程序采用了高效的压缩/解压库,出与感谢,我会把我的程序寄给他,希望在更加优越的压缩/解压方面,供他借鉴。。我会很高兴。。)


----------------解决方案--------------------------------------------------------
下来试用下!
----------------解决方案--------------------------------------------------------
it's so nice ,

great!
----------------解决方案--------------------------------------------------------

已成功加入了压缩和分卷功能!并采用LINUX帮助风格。。。

初步通过了测试!欢迎试玩!。。

主帖程序更新了!( 第二个)


----------------解决方案--------------------------------------------------------
更新了!加入了扇区到扇区读写。。

----------------解决方案--------------------------------------------------------
将要添加如下功能:
1
支持古董级硬盘(不支持扩展INT13)的压缩分卷
2
主分区的读写(此功能,只有C有实用意义,因为,一般用户都把很多盘弄成了扩展分区的逻辑驱动器了)

----------------解决方案--------------------------------------------------------

下面新增的功能已经实现了!

下面的功能已经实现了!

1


支持古董级硬盘(不支持扩展INT13)的压缩分卷

尽管不支持扩展INT13,把硬盘的扇区压缩成文件,还不成问题..

但是,把在某个硬盘的某个位置压缩成的镜象文件再恢复到另一个硬盘的不同位置,结果就不对。

要解决这个问题,就要费一翻脑筋啦!

因为之前的压缩了的文件中结构是不得不根据硬盘扇区的几何结构而来,

但是,以后,要把这个文件再解压到不同硬盘的不同位置时,就会不一致.解压后不能直接写到硬盘..

所以,要重新分析硬盘物理结构,然后,要先设几个缓冲,对解压出的数据进行调整到被允许的数据大小,还有剩余数据的处理等等,处理起来还是挺复杂的...

但是,被我拿下啦! 而且,只用了很少的代码!

测试的结果正确!


2

无论支持不支持扩展INT13,都能进行硬盘,分区(仅限于主分区)和任意扇区之间的复制.

这也涉及到对硬盘物理结构的解读,以及和支持扩展INT13的硬盘的协同工作..

***********************

************************

(小补充: 原先支持扩展INT13硬盘的读写,缓冲设为100扇区, 现发现可能能增大为125扇区(64000字节)!)

到此,想要加入的功能,都已完成了,很满足..而且,尽量力求代码的精简高效,和考虑使用者的常见习惯.

现在,正在归整代码,很快就全线完工啦!

(明天,再去买几块硬盘,以便全面,大规模的测试啦! 也看看 有没有不支持扩展INT13的古董硬盘?

前段时间买的老硬盘2GB左右,居然还是支持扩展INT13! 晕死!! 极度失望!

)


----------------解决方案--------------------------------------------------------
  相关解决方案