这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
1 S9 E, l4 {- T
: v( B( [& v* z( x: _其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...
: |6 k# a9 u2 e6 J: Y7 c9 s; m; J: f. F9 K2 Q8 `
这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..7 d) Z! W a& n( q
* e3 Z Y1 N& }1 ^
BF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的
7 e+ G" x) I+ R1 i& ~. S% A2 B% O$ E9 N3 m
BF格式有两个特点:1 [: r& K( W: g. ^
其一是文件表的递归存放,这个不算难,Quickbms也可以用
9 Z& C$ g/ B7 eStart Function XX
, [% s: ?( c8 O) l6 |End Function XX
. ?, Q x9 x" FCall Function XX
0 `9 J4 |6 } @# d' Z: f, Z+ R来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....
3 N% I( A6 V, y( W8 ^% m
0 D; f8 {" B2 f3 w. f& s其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,
$ v8 j" S% ?# E' \4 F R: {举个例子,文件名表中,每个文件的内容是这样的:
+ G: s" o8 W4 E# T' \& _+ ]文件名长度 文件名 文件大小 偏移量
3 ?) N; u! _2 R% w- g& _
% M# P. [$ z+ E" I! ]. W$ W也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。, i; v8 a9 z. F# K
$ y; [: W: N0 w+ U# D: N! o: p这是很麻烦的一点。# n, J' c+ e+ v: k. V+ N5 y. r6 g
这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。8 j# X3 Y5 z% D
6 t& w9 \) e* x5 b" Y
这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。/ `& K3 m# t& ~7 o+ W, y
然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。
8 f l1 P2 w' H$ K之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....
6 e, c3 M1 W/ g7 K' A5 R- ~0 q; y( @! `/ w9 l% F
目前还存在的问题是,这个打包器无法通用:
& i; R8 j" c% L8 S1 d% S
& Z+ j" w& l j7 Q; s* y因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法7 n/ J k0 h& X' s" f0 V
+ V$ C8 ~+ o1 k9 i2 a5 D9 l& c$ V
不过实际要通用也很容易,之前解包出来后看一下文件数量9 p1 P5 V9 R- X' X, `
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。4 b% z: \' }& T1 H
% Q6 y- q) Z6 F; A. I( l
解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。
$ X1 Z& [- P+ X# q+ D2 t
7 C8 L9 B1 M- L2 W打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename( t, F" @ m3 P" E- R9 D+ |* s
filename即要输出的包文件名 |