这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
) j$ d5 m* g/ z; n+ t2 ^" U& w/ A4 s( L) ^( V. `5 }) I; P/ [
其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...! R1 f0 f0 B! x1 b9 \7 }3 }
+ t" ]0 m1 {; @: `" I
这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..: k( J- ?7 ^" m0 H
$ [( ~9 a3 y8 L- kBF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的7 a, J% F/ L- e" M! u9 O
0 D3 L# \! |, Q: P% tBF格式有两个特点:
0 t; Y2 z' T' M" {其一是文件表的递归存放,这个不算难,Quickbms也可以用
# M- O) v* y/ JStart Function XX
0 U! c3 N ?, i! l1 Q+ W7 u R! [' xEnd Function XX) ?# _: F O$ s, T& T( F
Call Function XX
+ B4 R* }0 X+ G( b来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....
6 b' I+ V% b) t R! U5 V4 |# H, \
$ C' p$ ?. z# Z其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,7 h- @# _! E/ H7 ^* j w5 k" _6 D
举个例子,文件名表中,每个文件的内容是这样的:
5 c! d y D9 k8 f8 o+ A文件名长度 文件名 文件大小 偏移量
! ^4 e$ P! K0 d9 x* g$ k& s" ?/ h" }* d
也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。 d4 V: o+ I0 B* ]' [8 x
) o" Z$ @( M" z/ Z1 M" w1 K$ E这是很麻烦的一点。
x9 Z; f. c* A# ?2 i# U: M& Y& Z+ R这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。
' @3 b; ?0 n; S" u {) p; i% e) T! I$ j
这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。" Z" d' Y+ w, P, K, A- x
然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。2 F, o& \: r- e( S, ?1 v d S6 G
之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....& i4 u& Z' i; Z( ~" E% b7 p
C6 T0 Z# }* q- Q4 V9 x4 c* ]( T7 ~
目前还存在的问题是,这个打包器无法通用:" z' Y& [% B( a
' w- T u2 j/ b z
因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法
5 v$ E8 P2 V; P$ H6 Q6 s; x* |* P6 T, |" }0 U- D' u
不过实际要通用也很容易,之前解包出来后看一下文件数量; x5 P. I; Q( F$ m8 L2 t
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。
1 T6 G0 w( ~8 s1 y I. u0 h$ ?8 U
7 g; H- l' Q5 r0 e/ q' Q% }解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。; ~2 }( A2 r( M. `& Q4 Q2 k
# s' R- S1 j/ v0 j1 t1 Y; w5 D
打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename
* X: D3 O: r7 a- M, t% P/ Gfilename即要输出的包文件名 |