这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....0 h) c! \2 c0 M; k, h8 C- d( x- `; c
4 g0 A* c x' r K" b
其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...$ J( Z8 o; ^0 K' h6 J& c: G6 V
: ?7 j0 k3 _# l, _& u) K
这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..
" u& E4 M, B4 u, T: a
/ g3 t; c# |2 Y* ~, bBF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的
2 C* a% ^2 C) V+ G5 f' G
+ \" n' j t+ U3 x# u$ oBF格式有两个特点:
# C2 g q7 Q+ K! F其一是文件表的递归存放,这个不算难,Quickbms也可以用
" U+ t6 h5 j- v+ k4 W5 y, `Start Function XX
, G0 j3 {- R/ \ ^" X( _8 o1 H* g) s jEnd Function XX
3 j0 @7 w2 e$ \8 a( a' ]/ d# rCall Function XX+ y9 F# S f3 m6 m2 w4 M
来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....! C$ | Y* W4 s
) l: F& b0 u% W其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,
7 P0 ]3 c3 v1 u& K8 L举个例子,文件名表中,每个文件的内容是这样的:
! G4 _( f! a4 u0 o0 ~0 g8 d" l2 o文件名长度 文件名 文件大小 偏移量 s, T j" Z5 W: `: ~( {7 K
1 v8 K" q. [0 }3 W1 }, |! A
也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。7 H* b: l9 Y3 B$ X
; D. O( L; `; d' J这是很麻烦的一点。2 J( I( W$ z6 y1 S$ {0 k2 D1 ?
这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。# T, u) ]6 G) V2 ^, {$ l
/ V3 n* G4 ~' N2 ?2 W7 Y
这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。$ I! N* i* u# U, |# c
然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。2 `+ R0 s* _; c& g1 |7 D9 x* K
之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....
. o- j3 C! p) ?( p3 [ P. c8 V% W; C. U+ j$ h) D( u
目前还存在的问题是,这个打包器无法通用:) f2 Y+ i# ~+ t4 E# r4 h3 J1 h
% [ p. W/ A+ N4 V- i1 C. r
因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法5 f; b) N P3 y) o
0 ?/ N* ^1 E, D( o, c; M不过实际要通用也很容易,之前解包出来后看一下文件数量4 J# w$ n# w. W. a& Z
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。
2 L; l7 l. Z3 u6 O5 j4 T( J1 v( |* |1 d( k) k. p
解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。
9 J0 i* |" _) c% z- n2 W" c) R/ [1 p1 L8 M$ m3 A9 `3 M
打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename
9 S1 M* N y/ ^3 t' [$ j2 |. Ufilename即要输出的包文件名 |