这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
# Y; ^% B+ Q E
+ Y5 b' [5 G) F其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...; Z% ~3 c& M9 Y; |3 s
: c- ~" v! E U+ A2 p6 r这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..% S- o" t9 o3 v6 r
* O; G& ?% s3 q5 Y: Y* M- {) IBF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的
7 X+ C5 B) J+ W# ^$ Z' N
. i) |( j' s' \4 V2 {6 YBF格式有两个特点:' I A) ?& W: @+ w+ K
其一是文件表的递归存放,这个不算难,Quickbms也可以用
3 s9 s1 q0 l6 e. x4 j' ~3 ]Start Function XX; {5 J% D9 P2 D- t6 [2 S. }, m
End Function XX
9 g; L4 f! E$ M KCall Function XX k2 m% I) d( T, b d' H9 X$ X8 T
来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....7 g" P' a5 B9 ^4 e! I, F; B! y6 u
) Z- P: o: h1 e7 y其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,
2 S! Z" J7 n* ? H% y9 \举个例子,文件名表中,每个文件的内容是这样的:
# h0 `; H. N- ~2 B3 c% I! a文件名长度 文件名 文件大小 偏移量& U- `1 [5 d5 i! n, s) m& _
2 K) M1 S6 w" S' K4 B也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。
$ P# W2 y7 O4 _
5 C8 l4 R9 T- m4 ^6 U% M$ U0 x这是很麻烦的一点。& x$ Q e3 I$ ]' i# i
这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。4 _2 p6 T# C9 l0 A
6 N, R k9 o( [. f! S这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。
* ?# B1 H7 w8 z9 r然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。
( Y# X ~# u1 K' k" o9 i& N之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....
% ~ R% q$ a# [0 a C1 f1 N1 l* z0 Q% _& Y$ r
目前还存在的问题是,这个打包器无法通用:; k3 S! O2 x0 R, n1 X
: d! g9 t. U7 @8 S9 v
因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法
. e, M7 H% F+ K9 n+ V1 @* Y7 {: h1 B
不过实际要通用也很容易,之前解包出来后看一下文件数量$ @; ?& z- b5 j8 C$ I
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。
* j1 g2 _- i1 g% i2 X6 W
, Z& ]% F& e2 D' v' {3 e解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。; ~! P& q( T8 N, ?5 e
$ B9 z! D* @, O! d7 [打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename
7 ~0 n4 l+ a0 [) ^8 h/ D9 Ofilename即要输出的包文件名 |