这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
& G' Q1 W1 _: w1 {: B
$ Z! B' O3 J! @, c% d其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...
9 Y5 c, r7 E* i7 M# Q$ u- E, v* q9 Z& ^* ^
这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..
. a0 l+ s0 ?6 T1 E& m
* y. S: b. _7 RBF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的! S8 W3 Q$ {" _+ Z
) Q6 `/ ?8 s2 V+ _5 WBF格式有两个特点:# v6 [! a; a' L$ _) d1 |) j
其一是文件表的递归存放,这个不算难,Quickbms也可以用- D1 @. G5 }/ ]& m' G* y
Start Function XX
; t0 n! f A B# @/ q$ SEnd Function XX' R+ J( D% _1 N( v9 j3 G
Call Function XX
4 @9 O8 Y* Q' h6 v1 H9 F, P1 ?8 Z来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....
& V5 H; N1 H. t/ J, D, @' Q8 C$ u. u+ L |( k o" ^
其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,
+ A9 q6 _! Y, J' D举个例子,文件名表中,每个文件的内容是这样的:
4 @! E& E* W. O8 V t! D5 T" P1 ^文件名长度 文件名 文件大小 偏移量
* h( G* \. f* \; L1 ]
9 S& M% q9 G! {% f也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。
D2 I4 |( S. W+ c5 E0 D' Z+ m$ [* @
这是很麻烦的一点。
7 |" \0 f- m0 Z' |; W- v这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。
, v2 J% d) S- c: \# n! m* I- C; \7 A: U* y8 |: O
这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。
$ M% W! o- j! ]然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。* ]! I( _7 @/ p6 o
之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....
. E- X! _ z* e7 G
; |9 l5 F- L9 z4 Y* \# w目前还存在的问题是,这个打包器无法通用:) W( N! O" L/ i, v
# O* C0 p+ B K" S9 r
因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法
- S& ?4 n. b5 N4 \. y( V2 V b8 U) V7 I. v
不过实际要通用也很容易,之前解包出来后看一下文件数量
+ ]& m. r+ ^! G3 L% S/ `然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。
0 N w9 z: [) j, u, p5 j+ g5 x5 {
解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。
1 i! O) A6 g' z2 p. O4 b4 O0 f9 l6 {# T, C. ]) p) a& Z5 \
打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename) d0 {7 s) p+ P7 z- c) e' l. X+ Q
filename即要输出的包文件名 |