这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
7 Z# y F, I+ o
: s1 f* g G: j) p其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...9 H" i( |( j5 {$ m" m
& I1 ~! x2 Z! _
这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..- Z; I3 w" t; S+ Z
5 `( y) x) G% [- ?/ c5 `
BF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的
7 S- n% y" _2 J" d
5 u' i! Y0 R$ ]. a; d9 mBF格式有两个特点:
) t7 B! X' b8 }0 I- |1 W其一是文件表的递归存放,这个不算难,Quickbms也可以用
% P! Z# a) q; x6 S0 R: ~Start Function XX
' f9 u- E/ X8 Q, lEnd Function XX
! ^/ M/ c" K6 m( o( P$ \* y( a6 W3 rCall Function XX8 i# e) o/ g" r
来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....
5 {, d; |; B) C8 K4 u4 `) e( G4 g: S: `9 k
其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,
7 x& H I2 M- z9 [举个例子,文件名表中,每个文件的内容是这样的:- G% K m2 W4 S% }: \
文件名长度 文件名 文件大小 偏移量& ^6 i" K% d4 ]
9 S2 h0 p. o1 Q) I% f( Z; {( u: @也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。1 ~# u# t( M3 {- O! f
6 t$ e g0 e4 {: h$ M
这是很麻烦的一点。 i! h( S: `$ j
这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。. B" P* n4 b1 K j: f
8 |$ |1 L. Q6 o m: `这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。
8 m, U+ c" R, M4 u! t( W, _/ G- z然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。
6 V w) m8 \- _; B$ a之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....
- E+ b! [9 L$ f4 k( d7 E, ]* R2 G5 |# _' X2 F/ f" Q2 S) B
目前还存在的问题是,这个打包器无法通用:; |3 i. ]7 C6 p1 u
$ {9 M" x. P) s' `' ~% g$ {# u因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法( \3 H# }0 l" y
4 f" t9 q. \1 P
不过实际要通用也很容易,之前解包出来后看一下文件数量. L' b. X- a# n( n- |$ {
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。
, i# {& o, W6 s4 G. c- B6 e1 ]( Q( G. Y' `
解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。
2 g5 {0 X4 a0 p( {+ m
& a) i* E* }8 @打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename
5 k! S! z, Y( yfilename即要输出的包文件名 |